Hex Artifact Content

Artifact 5e1ae9e427f5c7f556b385fefa94cff4cfb817af:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 43 53  .#ifdef HAVE_PCS
0040: 43 4c 49 54 45 5f 48 0a 23 20 20 69 6e 63 6c 75  CLITE_H.#  inclu
0050: 64 65 20 3c 70 63 73 63 6c 69 74 65 2e 68 3e 0a  de <pcsclite.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 57 49 4e 53 43 41 52 44 5f 48 0a 23 20  VE_WINSCARD_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 73 63 61   include <winsca
0090: 72 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  rd.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 53 54 44 49 4e 54 5f  def HAVE_STDINT_
00b0: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74  H.#  include <st
00c0: 64 69 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  dint.h>.#endif.#
00d0: 69 66 64 65 66 20 48 41 56 45 5f 49 4e 54 54 59  ifdef HAVE_INTTY
00e0: 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65  PES_H.#  include
00f0: 20 3c 69 6e 74 74 79 70 65 73 2e 68 3e 0a 23 65   <inttypes.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 53 54 44 4c 49 42 5f 48 0a 23 20 20 69 6e 63  _STDLIB_H.#  inc
0120: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0130: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0140: 56 45 5f 55 4e 49 53 54 44 5f 48 0a 23 20 20 69  VE_UNISTD_H.#  i
0150: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0160: 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  >.#endif.#ifdef 
0170: 48 41 56 45 5f 53 54 52 49 4e 47 5f 48 0a 23 20  HAVE_STRING_H.# 
0180: 20 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67   include <string
0190: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
01a0: 66 20 48 41 56 45 5f 50 54 48 52 45 41 44 5f 48  f HAVE_PTHREAD_H
01b0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 74 68  .#  include <pth
01c0: 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  read.h>.#endif.#
01d0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 4d 49 54  ifdef HAVE_LIMIT
01e0: 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  S_H.#  include <
01f0: 6c 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66  limits.h>.#endif
0200: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 54 44  .#ifdef HAVE_STD
0210: 49 4f 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20  IO_H.#  include 
0220: 3c 73 74 64 69 6f 2e 68 3e 0a 23 65 6e 64 69 66  <stdio.h>.#endif
0230: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 5a 4c 49  .#ifdef HAVE_ZLI
0240: 42 5f 48 0a 23 20 20 69 66 64 65 66 20 48 41 56  B_H.#  ifdef HAV
0250: 45 5f 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c  E_LIBZ.#    incl
0260: 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20  ude <zlib.h>.#  
0270: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69  endif.#else.#  i
0280: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23  fdef HAVE_LIBZ.#
0290: 20 20 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c      undef HAVE_L
02a0: 49 42 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  IBZ.#  endif.#en
02b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f  dif..#define CK_
02c0: 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b  PTR *.#define CK
02d0: 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
02e0: 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d  (returnType, nam
02f0: 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61  e) returnType na
0300: 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45  me.#define CK_DE
0310: 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72  CLARE_FUNCTION(r
0320: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
0330: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65   returnType name
0340: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c  .#define CK_DECL
0350: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49  ARE_FUNCTION_POI
0360: 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c  NTER(returnType,
0370: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0380: 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69  e (* name).#defi
0390: 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46  ne CK_CALLBACK_F
03a0: 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79  UNCTION(returnTy
03b0: 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e  pe, name) return
03c0: 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69  Type (* name).#i
03d0: 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23  fndef NULL_PTR.#
03e0: 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54    define NULL_PT
03f0: 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63  R 0.#endif..#inc
0400: 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a  lude "pkcs11.h".
0410: 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78  #include "asn1-x
0420: 35 30 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20  509.h"..#ifndef 
0430: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0440: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20  VERSION_CODE.#  
0450: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52  define CACKEY_CR
0460: 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
0470: 4f 44 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e  ODE 0x021e00.#en
0480: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41  dif..#ifndef CKA
0490: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
04a0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
04b0: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
04c0: 54 48 20 30 78 63 65 35 33 36 33 35 38 0a 23 65  TH 0xce536358.#e
04d0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
04e0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04f0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
0500: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
0510: 54 48 20 30 78 63 65 35 33 36 33 35 39 0a 23 65  TH 0xce536359.#e
0520: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
0530: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
0540: 49 4e 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b  ING.#  define CK
0550: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
0560: 4e 49 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a  NING 0xce53635a.
0570: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43  #endif.#ifndef C
0580: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
0590: 52 4f 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66  ROTECTION.#  def
05a0: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ine CKA_TRUST_EM
05b0: 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30  AIL_PROTECTION 0
05c0: 78 63 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66  xce53635b.#endif
05d0: 0a 0a 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31  ../* GSC-IS v2.1
05e0: 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a   Definitions */.
05f0: 2f 2a 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a  /** Classes **/.
0600: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c  #define GSCIS_CL
0610: 41 53 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20  ASS_ISO7816     
0620: 20 20 20 20 20 20 30 78 30 30 0a 23 64 65 66 69        0x00.#defi
0630: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  ne GSCIS_CLASS_G
0640: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20  LOBAL_PLATFORM  
0650: 20 30 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72   0x80../** Instr
0660: 75 63 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66  uctions **/.#def
0670: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0680: 47 45 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20  GET_RESPONSE    
0690: 20 20 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47    0xC0.#define G
06a0: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
06b0: 42 49 4e 41 52 59 20 20 20 20 20 20 20 30 78 42  BINARY       0xB
06c0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06d0: 49 4e 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e  INSTR_UPDATE_BIN
06e0: 41 52 59 20 20 20 20 20 30 78 44 36 0a 23 64 65  ARY     0xD6.#de
06f0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0700: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
0710: 20 20 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20     0xA4.#define 
0720: 47 53 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45  GSCIS_INSTR_EXTE
0730: 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78  RNAL_AUTH     0x
0740: 38 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  82.#define GSCIS
0750: 5f 49 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c  _INSTR_GET_CHALL
0760: 45 4e 47 45 20 20 20 20 20 30 78 38 34 0a 23 64  ENGE     0x84.#d
0770: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0780: 52 5f 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20  R_INTERNAL_AUTH 
0790: 20 20 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65      0x88.#define
07a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
07b0: 49 46 59 20 20 20 20 20 20 20 20 20 20 20 20 30  IFY            0
07c0: 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x20.#define GSCI
07d0: 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20  S_INSTR_SIGN    
07e0: 20 20 20 20 20 20 20 20 20 20 30 78 32 41 0a 23            0x2A.#
07f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0800: 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20  TR_GET_PROP     
0810: 20 20 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e       0x56.#defin
0820: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0830: 54 5f 41 43 52 20 20 20 20 20 20 20 20 20 20 20  T_ACR           
0840: 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43  0x4C.#define GSC
0850: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
0860: 46 46 45 52 20 20 20 20 20 20 20 30 78 35 32 0a  FFER       0x52.
0870: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0880: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20  STR_SIGNDECRYPT 
0890: 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66        0x42..#def
08a0: 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f  ine GSCIS_PARAM_
08b0: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20  SELECT_APPLET   
08c0: 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73    0x04../** Tags
08d0: 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61   **/./*** CCC Ta
08e0: 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  gs ***/.#define 
08f0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0910: 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  F0.#define GSCIS
0920: 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20  _TAG_CCC_VER    
0930: 20 20 20 20 20 20 20 20 20 30 78 46 31 0a 23 64           0xF1.#d
0940: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0950: 43 43 47 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCG_VER         
0960: 20 20 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65      0xF2.#define
0970: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
0980: 52 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  RL             0
0990: 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF3.#define GSCI
09a0: 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20  S_TAG_PKCS15    
09b0: 20 20 20 20 20 20 20 20 20 20 30 78 46 34 0a 23            0xF4.#
09c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09d0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20  _REG_DATA_MODEL 
09e0: 20 20 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e       0xF5.#defin
09f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
0a00: 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20  TABLE           
0a10: 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF6.#define GSC
0a20: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55  IS_TAG_CARD_APDU
0a30: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 37 0a             0xF7.
0a40: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a50: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20  G_REDIRECTION   
0a60: 20 20 20 20 20 20 30 78 46 41 0a 23 64 65 66 69        0xFA.#defi
0a70: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20  ne GSCIS_TAG_CT 
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53   0xFB.#define GS
0aa0: 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20  CIS_TAG_ST      
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 43              0xFC
0ac0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ad0: 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20  AG_NEXTCCC      
0ae0: 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a         0xFD../**
0af0: 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32  * General - EF 2
0b00: 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  200 ***/.#define
0b10: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45   GSCIS_TAG_FNAME
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0b30: 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x01.#define GSCI
0b40: 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20  S_TAG_MNAME     
0b50: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0a 23            0x02.#
0b60: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b70: 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _LNAME          
0b80: 20 20 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e       0x03.#defin
0b90: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46  e GSCIS_TAG_SUFF
0ba0: 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  IX              
0bb0: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x04.#define GSC
0bc0: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
0bd0: 43 59 20 20 20 20 20 20 20 20 20 30 78 30 35 0a  CY         0x05.
0be0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0bf0: 47 5f 42 55 52 45 41 55 20 20 20 20 20 20 20 20  G_BUREAU        
0c00: 20 20 20 20 20 20 30 78 30 36 0a 23 64 65 66 69        0x06.#defi
0c10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c20: 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EAU_CODE        
0c30: 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53   0x07.#define GS
0c40: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
0c50: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 30 38  E           0x08
0c60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c70: 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20  AG_TITLE        
0c80: 20 20 20 20 20 20 20 30 78 30 39 0a 23 64 65 66         0x09.#def
0c90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ine GSCIS_TAG_BU
0ca0: 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20 20 20  ILDING          
0cb0: 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47    0x10.#define G
0cc0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
0cd0: 41 44 44 52 31 20 20 20 20 20 20 20 20 30 78 31  ADDR1        0x1
0ce0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
0cf0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32  TAG_OFFICE_ADDR2
0d00: 20 20 20 20 20 20 20 20 30 78 31 32 0a 23 64 65          0x12.#de
0d10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d20: 46 46 49 43 45 5f 43 49 54 59 20 20 20 20 20 20  FFICE_CITY      
0d30: 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20     0x13.#define 
0d40: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d50: 5f 53 54 41 54 45 20 20 20 20 20 20 20 20 30 78  _STATE        0x
0d60: 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  14.#define GSCIS
0d70: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20  _TAG_OFFICE_ZIP 
0d80: 20 20 20 20 20 20 20 20 20 30 78 31 35 0a 23 64           0x15.#d
0d90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0da0: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20  OFFICE_COUNTRY  
0db0: 20 20 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65      0x16.#define
0dc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0dd0: 45 5f 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30  E_PHONE        0
0de0: 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x17.#define GSCI
0df0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e00: 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23  NE_EXT    0x18.#
0e10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e20: 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20 20 20  _OFFICE_FAX     
0e30: 20 20 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e       0x19.#defin
0e40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e50: 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20  CE_EMAIL        
0e60: 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43  0x1A.#define GSC
0e70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
0e80: 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31 42 0a  OM         0x1B.
0e90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0ea0: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20  G_NONGOV_AGENCY 
0eb0: 20 20 20 20 20 20 30 78 31 43 0a 23 64 65 66 69        0x1C.#defi
0ec0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  ne GSCIS_TAG_SSN
0ed0: 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20  _DESIGNATOR     
0ee0: 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20   0x1D../*** PII 
0ef0: 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23  - EF 2100 ***/.#
0f00: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0f10: 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20 20 20  _SSN            
0f20: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e       0x20.#defin
0f30: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20  e GSCIS_TAG_DOB 
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0x21.#define GSC
0f60: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20  IS_TAG_GENDER   
0f70: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 32 0a             0x22.
0f80: 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f  ./*** Login Info
0f90: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30  rmation - EF 400
0fa0: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
0fb0: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20  SCIS_TAG_USERID 
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34               0x4
0fd0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0fe0: 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20  TAG_DOMAIN      
0ff0: 20 20 20 20 20 20 20 20 30 78 34 31 0a 23 64 65          0x41.#de
1000: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50  fine GSCIS_TAG_P
1010: 41 53 53 57 4f 52 44 20 20 20 20 20 20 20 20 20  ASSWORD         
1020: 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61     0x42../*** Ca
1030: 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  rd Information -
1040: 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 5000 ***/.#d
1050: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1060: 49 53 53 55 45 52 49 44 20 20 20 20 20 20 20 20  ISSUERID        
1070: 20 20 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65      0x50.#define
1080: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f   GSCIS_TAG_SERNO
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
10a0: 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x51.#define GSCI
10b0: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
10c0: 20 20 20 20 20 20 20 20 20 20 30 78 35 32 0a 23            0x52.#
10d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10e0: 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 20 20  _EXPIRE_DATE    
10f0: 20 20 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e       0x53.#defin
1100: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
1110: 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20  _TYPE           
1120: 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x54.#define GSC
1130: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
1140: 43 4f 44 45 20 20 20 20 20 20 20 30 78 35 37 0a  CODE       0x57.
1150: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1160: 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20 20 20  G_CARDID_AID    
1170: 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a        0x58../***
1180: 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e   PKI Information
1190: 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a   - EF 7000 ***/.
11a0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
11b0: 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 20 20  G_CERTIFICATE   
11c0: 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 66 69        0x70.#defi
11d0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  ne GSCIS_TAG_CER
11e0: 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20  T_ISSUE_DATE    
11f0: 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53   0x71.#define GS
1200: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
1210: 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 37 32  IRE_DATE    0x72
1220: 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73  ../** Applet IDs
1230: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43   **/.#define GSC
1240: 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20  IS_AID_CCC      
1250: 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 2c             0xA0,
1260: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1270: 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30  1, 0x16, 0xDB, 0
1280: 78 30 30 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x00../* Maximum 
1290: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
12a0: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
12b0: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
12c0: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
12d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
12e0: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
12f0: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 23 69           250..#i
1300: 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
1310: 47 0a 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  G..#  define CAC
1320: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1330: 28 78 2e 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66  (x...) { fprintf
1340: 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25  (stderr, "%s():%
1350: 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  i: ", __func__, 
1360: 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e  __LINE__); fprin
1370: 74 66 28 73 74 64 65 72 72 2c 20 78 29 3b 20 66  tf(stderr, x); f
1380: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1390: 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28 73 74 64  \n"); fflush(std
13a0: 65 72 72 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e  err); }.#  defin
13b0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
13c0: 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29  RINTBUF(f, x, y)
13d0: 20 7b 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72   { unsigned char
13e0: 20 2a 54 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e   *TMPBUF; unsign
13f0: 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50  ed long idx; TMP
1400: 42 55 46 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  BUF = (unsigned 
1410: 63 68 61 72 20 2a 29 20 28 78 29 3b 20 66 70 72  char *) (x); fpr
1420: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
1430: 28 29 3a 25 69 3a 20 25 73 20 20 28 25 73 2f 25  ():%i: %s  (%s/%
1440: 6c 75 20 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66  lu = {%02x", __f
1450: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c  unc__, __LINE__,
1460: 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e 65   f, #x, (unsigne
1470: 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50  d long) (y), TMP
1480: 42 55 46 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64  BUF[0]); for (id
1490: 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29  x = 1; idx < (y)
14a0: 3b 20 69 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e  ; idx++) { fprin
14b0: 74 66 28 73 74 64 65 72 72 2c 20 22 2c 20 25 30  tf(stderr, ", %0
14c0: 32 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d  2x", TMPBUF[idx]
14d0: 29 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28 73 74  ); }; fprintf(st
14e0: 64 65 72 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 66  derr, "})\n"); f
14f0: 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d  flush(stderr); }
1500: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
1510: 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28 78  Y_DEBUG_PERROR(x
1520: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65  ) { fprintf(stde
1530: 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c  rr, "%s():%i: ",
1540: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
1550: 45 5f 5f 29 3b 20 70 65 72 72 6f 72 28 78 29 3b  E__); perror(x);
1560: 20 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b   fflush(stderr);
1570: 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 72 65   }.#  define fre
1580: 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f 44 45  e(x) { CACKEY_DE
1590: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52 45 45  BUG_PRINTF("FREE
15a0: 28 25 70 29 20 28 25 73 29 22 2c 20 78 2c 20 23  (%p) (%s)", x, #
15b0: 78 29 3b 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a  x); free(x); }..
15c0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43  static void *CAC
15d0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d  KEY_DEBUG_FUNC_M
15e0: 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a  ALLOC(size_t siz
15f0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  e, const char *f
1600: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b  unc, int line) {
1610: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a  ..void *retval;.
1620: 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f  ..retval = mallo
1630: 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e  c(size);...fprin
1640: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
1650: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69  :%i: ", func, li
1660: 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  ne);..fprintf(st
1670: 64 65 72 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20  derr, "MALLOC() 
1680: 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a  = %p", retval);.
1690: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
16a0: 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28   "\n");..fflush(
16b0: 73 74 64 65 72 72 29 3b 0a 0a 09 72 65 74 75 72  stderr);...retur
16c0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
16d0: 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45  atic void *CACKE
16e0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
16f0: 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c 20  LLOC(void *ptr, 
1700: 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e  size_t size, con
1710: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69  st char *func, i
1720: 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64  nt line) {..void
1730: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
1740: 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72  al = realloc(ptr
1750: 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72  , size);...if (r
1760: 65 74 76 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a  etval != ptr) {.
1770: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
1780: 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66  , "%s():%i: ", f
1790: 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 09 66 70  unc, line);...fp
17a0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 52  rintf(stderr, "R
17b0: 45 41 4c 4c 4f 43 28 25 70 29 20 3d 20 25 70 22  EALLOC(%p) = %p"
17c0: 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a  , ptr, retval);.
17d0: 09 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
17e0: 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 66 6c 75 73  , "\n");...fflus
17f0: 68 28 73 74 64 65 72 72 29 3b 0a 09 7d 0a 0a 09  h(stderr);..}...
1800: 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e 55  if (retval == NU
1810: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1820: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a 2a  EBUG_PRINTF(" **
1830: 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61 6c  * ERROR *** real
1840: 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55 4c  loc returned NUL
1850: 4c 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  L");..}...return
1860: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
1870: 74 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59  tic char *CACKEY
1880: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44  _DEBUG_FUNC_STRD
1890: 55 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  UP(const char *p
18a0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
18b0: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
18c0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b  {..char *retval;
18d0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64  ...retval = strd
18e0: 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e  up(ptr);...fprin
18f0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
1900: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69  :%i: ", func, li
1910: 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  ne);..fprintf(st
1920: 64 65 72 72 2c 20 22 53 54 52 44 55 50 5f 4d 41  derr, "STRDUP_MA
1930: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
1940: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
1950: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 09  stderr, "\n");..
1960: 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 0a  fflush(stderr);.
1970: 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
1980: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
1990: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
19a0: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
19b0: 5f 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68  _STR(unsigned ch
19c0: 61 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63  ar tag) {..switc
19d0: 68 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65  h (tag) {...case
19e0: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49   GSCIS_TAG_CARDI
19f0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
1a00: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29  CIS_TAG_CARDID")
1a10: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1a20: 41 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72  AG_CCC_VER:....r
1a30: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1a40: 5f 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61  _CCC_VER");...ca
1a50: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47  se GSCIS_TAG_CCG
1a60: 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  _VER:....return(
1a70: 22 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56  "GSCIS_TAG_CCG_V
1a80: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ER");...case GSC
1a90: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a  IS_TAG_CARDURL:.
1aa0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1ab0: 5f 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a  _TAG_CARDURL");.
1ac0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
1ad0: 5f 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75  _PKCS15:....retu
1ae0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b  rn("GSCIS_TAG_PK
1af0: 43 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47  CS15");...case G
1b00: 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54  SCIS_TAG_REG_DAT
1b10: 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75  A_MODEL:....retu
1b20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
1b30: 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a  G_DATA_MODEL");.
1b40: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
1b50: 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72  _ACR_TABLE:....r
1b60: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1b70: 5f 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09  _ACR_TABLE");...
1b80: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
1b90: 41 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74  ARD_APDU:....ret
1ba0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
1bb0: 41 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61  ARD_APDU");...ca
1bc0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  se GSCIS_TAG_RED
1bd0: 49 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74  IRECTION:....ret
1be0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52  urn("GSCIS_TAG_R
1bf0: 45 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09  EDIRECTION");...
1c00: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
1c10: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  T:....return("GS
1c20: 43 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09  CIS_TAG_CT");...
1c30: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
1c40: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  T:....return("GS
1c50: 43 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09  CIS_TAG_ST");...
1c60: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e  case GSCIS_TAG_N
1c70: 45 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72  EXTCCC:....retur
1c80: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58  n("GSCIS_TAG_NEX
1c90: 54 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47  TCCC");...case G
1ca0: 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a  SCIS_TAG_FNAME:.
1cb0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1cc0: 5f 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09  _TAG_FNAME");...
1cd0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d  case GSCIS_TAG_M
1ce0: 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  NAME:....return(
1cf0: 22 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45  "GSCIS_TAG_MNAME
1d00: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1d10: 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72  _TAG_LNAME:....r
1d20: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1d30: 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65  _LNAME");...case
1d40: 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49   GSCIS_TAG_SUFFI
1d50: 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  X:....return("GS
1d60: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29  CIS_TAG_SUFFIX")
1d70: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1d80: 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a  AG_GOVT_AGENCY:.
1d90: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1da0: 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59  _TAG_GOVT_AGENCY
1db0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1dc0: 5f 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09  _TAG_BUREAU:....
1dd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1de0: 47 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61  G_BUREAU");...ca
1df0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  se GSCIS_TAG_BUR
1e00: 45 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74  EAU_CODE:....ret
1e10: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
1e20: 55 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09  UREAU_CODE");...
1e30: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44  case GSCIS_TAG_D
1e40: 45 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74  EPT_CODE:....ret
1e50: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44  urn("GSCIS_TAG_D
1e60: 45 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61  EPT_CODE");...ca
1e70: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54  se GSCIS_TAG_TIT
1e80: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  LE:....return("G
1e90: 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29  SCIS_TAG_TITLE")
1ea0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1eb0: 41 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09  AG_BUILDING:....
1ec0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1ed0: 47 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09  G_BUILDING");...
1ee0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
1ef0: 46 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09  FFICE_ADDR1:....
1f00: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1f10: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29  G_OFFICE_ADDR1")
1f20: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1f30: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a  AG_OFFICE_ADDR2:
1f40: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
1f50: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44  S_TAG_OFFICE_ADD
1f60: 52 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  R2");...case GSC
1f70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49  IS_TAG_OFFICE_CI
1f80: 54 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TY:....return("G
1f90: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
1fa0: 43 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47  CITY");...case G
1fb0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
1fc0: 53 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  STATE:....return
1fd0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
1fe0: 43 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61  CE_STATE");...ca
1ff0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2000: 49 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75  ICE_ZIP:....retu
2010: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2020: 46 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61  FICE_ZIP");...ca
2030: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2040: 49 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09  ICE_COUNTRY:....
2050: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2060: 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59  G_OFFICE_COUNTRY
2070: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2080: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e  _TAG_OFFICE_PHON
2090: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
20a0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
20b0: 48 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47  HONE");...case G
20c0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
20d0: 50 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65  PHONE_EXT:....re
20e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
20f0: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54  OFFICE_PHONE_EXT
2100: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2110: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a  _TAG_OFFICE_FAX:
2120: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2130: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58  S_TAG_OFFICE_FAX
2140: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2150: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49  _TAG_OFFICE_EMAI
2160: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  L:....return("GS
2170: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45  CIS_TAG_OFFICE_E
2180: 4d 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47  MAIL");...case G
2190: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
21a0: 52 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28  ROOM:....return(
21b0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
21c0: 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65  E_ROOM");...case
21d0: 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f   GSCIS_TAG_NONGO
21e0: 56 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74  V_AGENCY:....ret
21f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e  urn("GSCIS_TAG_N
2200: 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a  ONGOV_AGENCY");.
2210: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2220: 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a  _SSN_DESIGNATOR:
2230: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2240: 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e  S_TAG_SSN_DESIGN
2250: 41 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47  ATOR");...case G
2260: 53 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09  SCIS_TAG_SSN:...
2270: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2280: 41 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65  AG_SSN");...case
2290: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a   GSCIS_TAG_DOB:.
22a0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
22b0: 5f 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61  _TAG_DOB");...ca
22c0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e  se GSCIS_TAG_GEN
22d0: 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DER:....return("
22e0: 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52  GSCIS_TAG_GENDER
22f0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2300: 5f 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09  _TAG_USERID:....
2310: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2320: 47 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61  G_USERID");...ca
2330: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d  se GSCIS_TAG_DOM
2340: 41 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AIN:....return("
2350: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e  GSCIS_TAG_DOMAIN
2360: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2370: 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09  _TAG_PASSWORD:..
2380: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2390: 54 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a  TAG_PASSWORD");.
23a0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
23b0: 5f 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65  _ISSUERID:....re
23c0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
23d0: 49 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61  ISSUERID");...ca
23e0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52  se GSCIS_TAG_SER
23f0: 4e 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  NO:....return("G
2400: 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29  SCIS_TAG_SERNO")
2410: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2420: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09  AG_ISSUE_DATE:..
2430: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2440: 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29  TAG_ISSUE_DATE")
2450: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2460: 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a  AG_EXPIRE_DATE:.
2470: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2480: 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45  _TAG_EXPIRE_DATE
2490: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
24a0: 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a  _TAG_CARD_TYPE:.
24b0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
24c0: 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29  _TAG_CARD_TYPE")
24d0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
24e0: 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45  AG_SECURITY_CODE
24f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2500: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
2510: 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47  CODE");...case G
2520: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
2530: 41 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AID:....return("
2540: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
2550: 5f 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47  _AID");...case G
2560: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
2570: 43 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  CATE:....return(
2580: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49  "GSCIS_TAG_CERTI
2590: 46 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65  FICATE");...case
25a0: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f   GSCIS_TAG_CERT_
25b0: 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72  ISSUE_DATE:....r
25c0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
25d0: 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45  _CERT_ISSUE_DATE
25e0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
25f0: 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45  _TAG_CERT_EXPIRE
2600: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
2610: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  ("GSCIS_TAG_CERT
2620: 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a  _EXPIRE_DATE");.
2630: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b  .}...return("UNK
2640: 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69  NOWN");.}..stati
2650: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
2660: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
2670: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
2680: 4c 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a  LONG retcode) {.
2690: 09 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65  .switch (retcode
26a0: 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ) {...case SCARD
26b0: 5f 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72  _S_SUCCESS:....r
26c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53  eturn("SCARD_S_S
26d0: 55 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65  UCCESS");...case
26e0: 20 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c   SCARD_E_CANCELL
26f0: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
2700: 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44  CARD_E_CANCELLED
2710: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2720: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a  _E_CANT_DISPOSE:
2730: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2740: 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45  D_E_CANT_DISPOSE
2750: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2760: 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f  _E_INSUFFICIENT_
2770: 42 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72  BUFFER:....retur
2780: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46  n("SCARD_E_INSUF
2790: 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29  FICIENT_BUFFER")
27a0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
27b0: 5f 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09  _INVALID_ATR:...
27c0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
27d0: 5f 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a  _INVALID_ATR");.
27e0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
27f0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09  NVALID_HANDLE:..
2800: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2810: 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  E_INVALID_HANDLE
2820: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2830: 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d  _E_INVALID_PARAM
2840: 45 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ETER:....return(
2850: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
2860: 5f 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09  _PARAMETER");...
2870: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56  case SCARD_E_INV
2880: 41 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09  ALID_TARGET:....
2890: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
28a0: 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29  INVALID_TARGET")
28b0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
28c0: 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a  _INVALID_VALUE:.
28d0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
28e0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45  _E_INVALID_VALUE
28f0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2900: 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09  _E_NO_MEMORY:...
2910: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2920: 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09  _NO_MEMORY");...
2930: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b  case SCARD_E_UNK
2940: 4e 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09  NOWN_READER:....
2950: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2960: 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29  UNKNOWN_READER")
2970: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2980: 5f 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74  _TIMEOUT:....ret
2990: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d  urn("SCARD_E_TIM
29a0: 45 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53  EOUT");...case S
29b0: 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56  CARD_E_SHARING_V
29c0: 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74  IOLATION:....ret
29d0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41  urn("SCARD_E_SHA
29e0: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29  RING_VIOLATION")
29f0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2a00: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09  _NO_SMARTCARD:..
2a10: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2a20: 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29  E_NO_SMARTCARD")
2a30: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2a40: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09  _UNKNOWN_CARD:..
2a50: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2a60: 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29  E_UNKNOWN_CARD")
2a70: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2a80: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a  _PROTO_MISMATCH:
2a90: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2aa0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
2ab0: 43 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  CH");...case SCA
2ac0: 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a  RD_E_NOT_READY:.
2ad0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2ae0: 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a  _E_NOT_READY");.
2af0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53  ..case SCARD_E_S
2b00: 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a  YSTEM_CANCELLED:
2b10: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2b20: 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45  D_E_SYSTEM_CANCE
2b30: 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  LLED");...case S
2b40: 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53  CARD_E_NOT_TRANS
2b50: 41 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ACTED:....return
2b60: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52  ("SCARD_E_NOT_TR
2b70: 41 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61  ANSACTED");...ca
2b80: 73 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45  se SCARD_E_READE
2b90: 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09  R_UNAVAILABLE:..
2ba0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2bb0: 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c  E_READER_UNAVAIL
2bc0: 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53  ABLE");...case S
2bd0: 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54  CARD_W_UNSUPPORT
2be0: 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ED_CARD:....retu
2bf0: 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55  rn("SCARD_W_UNSU
2c00: 50 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a  PPORTED_CARD");.
2c10: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55  ..case SCARD_W_U
2c20: 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44  NRESPONSIVE_CARD
2c30: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2c40: 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56  RD_W_UNRESPONSIV
2c50: 45 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65  E_CARD");...case
2c60: 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52   SCARD_W_UNPOWER
2c70: 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ED_CARD:....retu
2c80: 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f  rn("SCARD_W_UNPO
2c90: 57 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09  WERED_CARD");...
2ca0: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53  case SCARD_W_RES
2cb0: 45 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ET_CARD:....retu
2cc0: 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45  rn("SCARD_W_RESE
2cd0: 54 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65  T_CARD");...case
2ce0: 20 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44   SCARD_W_REMOVED
2cf0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
2d00: 28 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45  ("SCARD_W_REMOVE
2d10: 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65  D_CARD");...case
2d20: 20 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f   SCARD_E_PCI_TOO
2d30: 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72  _SMALL:....retur
2d40: 6e 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54  n("SCARD_E_PCI_T
2d50: 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61  OO_SMALL");...ca
2d60: 73 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45  se SCARD_E_READE
2d70: 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09  R_UNSUPPORTED:..
2d80: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2d90: 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f  E_READER_UNSUPPO
2da0: 52 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  RTED");...case S
2db0: 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45  CARD_E_DUPLICATE
2dc0: 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75  _READER:....retu
2dd0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c  rn("SCARD_E_DUPL
2de0: 49 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a  ICATE_READER");.
2df0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43  ..case SCARD_E_C
2e00: 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a  ARD_UNSUPPORTED:
2e10: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2e20: 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f  D_E_CARD_UNSUPPO
2e30: 52 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  RTED");...case S
2e40: 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43  CARD_E_NO_SERVIC
2e50: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
2e60: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
2e70: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2e80: 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50  _E_SERVICE_STOPP
2e90: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
2ea0: 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53  CARD_E_SERVICE_S
2eb0: 54 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65  TOPPED");...case
2ec0: 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45   SCARD_W_INSERTE
2ed0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
2ee0: 6e 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52  n("SCARD_W_INSER
2ef0: 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  TED_CARD");...ca
2f00: 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55 50  se SCARD_E_UNSUP
2f10: 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a 0a  PORTED_FEATURE:.
2f20: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2f30: 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46  _E_UNSUPPORTED_F
2f40: 45 41 54 55 52 45 22 29 3b 0a 23 69 66 64 65 66  EATURE");.#ifdef
2f50: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44   SCARD_E_NO_READ
2f60: 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09  ERS_AVAILABLE...
2f70: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  case SCARD_E_NO_
2f80: 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c  READERS_AVAILABL
2f90: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
2fa0: 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53  ARD_E_NO_READERS
2fb0: 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65  _AVAILABLE");.#e
2fc0: 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ndif..}...return
2fd0: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a  ("UNKNOWN");.}..
2fe0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2ff0: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
3000: 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54  FUNC_OBJID_TO_ST
3010: 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64  R(uint16_t objid
3020: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a  ) {..switch (obj
3030: 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32  id) {...case 0x2
3040: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3050: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3060: 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a  _GENERALINFO");.
3070: 09 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09  ..case 0x2100:..
3080: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3090: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45  _TLV_OBJID_PROPE
30a0: 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09  RSONALINFO");...
30b0: 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09  case 0x3000:....
30c0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
30d0: 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43  LV_OBJID_ACCESSC
30e0: 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65  ONTROL");...case
30f0: 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75   0x4000:....retu
3100: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3110: 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09  BJID_LOGIN");...
3120: 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09  case 0x5000:....
3130: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3140: 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46  LV_OBJID_CARDINF
3150: 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30  O");...case 0x60
3160: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3170: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3180: 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09  BIOMETRICS");...
3190: 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09  case 0x7000:....
31a0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
31b0: 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c  LV_OBJID_DIGITAL
31c0: 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73  SIGCERT");...cas
31d0: 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74  e 0x0200:....ret
31e0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
31f0: 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e  OBJID_CAC_PERSON
3200: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30  ");...case 0x020
3210: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  2:....return("CA
3220: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
3230: 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09  AC_BENEFITS");..
3240: 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09  .case 0x0203:...
3250: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3260: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54  TLV_OBJID_CAC_OT
3270: 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09  HERBENEFITS");..
3280: 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09  .case 0x0201:...
3290: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
32a0: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
32b0: 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73  RSONNEL");...cas
32c0: 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74  e 0x02FE:....ret
32d0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
32e0: 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52  OBJID_CAC_PKICER
32f0: 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72  T");..}....retur
3300: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
3310: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3320: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3330: 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f  _FUNC_APPTYPE_TO
3340: 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70  _STR(uint8_t app
3350: 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20  type) {..switch 
3360: 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61  (apptype) {...ca
3370: 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75  se 0x00:....retu
3380: 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61  rn("NONE");...ca
3390: 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75  se 0x01:....retu
33a0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
33b0: 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09  PP_GENERIC");...
33c0: 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65  case 0x02:....re
33d0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
33e0: 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61  _APP_SKI");...ca
33f0: 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75  se 0x03:....retu
3400: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
3410: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43  PP_GENERIC | CAC
3420: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22  KEY_TLV_APP_SKI"
3430: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a  );...case 0x04:.
3440: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3450: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b  Y_TLV_APP_PKI");
3460: 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09  ...case 0x05:...
3470: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3480: 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20  TLV_APP_GENERIC 
3490: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
34a0: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _PKI");...case 0
34b0: 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x06:....return("
34c0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
34d0: 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  KI | CACKEY_TLV_
34e0: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
34f0: 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72  e 0x07:....retur
3500: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3510: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
3520: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c  EY_TLV_APP_SKI |
3530: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3540: 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  PKI");..}...retu
3550: 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d  rn("INVALID");.}
3560: 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c  ..#  define mall
3570: 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42  oc(x) CACKEY_DEB
3580: 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78  UG_FUNC_MALLOC(x
3590: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
35a0: 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20  NE__).#  define 
35b0: 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41  realloc(x, y) CA
35c0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
35d0: 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f  REALLOC(x, y, __
35e0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
35f0: 29 0a 23 20 20 69 66 64 65 66 20 73 74 72 64 75  ).#  ifdef strdu
3600: 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74 72  p.#    undef str
3610: 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20  dup.#  endif.#  
3620: 64 65 66 69 6e 65 20 73 74 72 64 75 70 28 78 29  define strdup(x)
3630: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
3640: 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66  NC_STRDUP(x, __f
3650: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
3660: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
3670: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
3680: 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a  INTF(x...) /**/.
3690: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
36a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
36b0: 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20  f, x, y) /**/.# 
36c0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
36d0: 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 2f  EBUG_PERROR(x) /
36e0: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41  **/.#  define CA
36f0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3700: 54 41 47 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  TAG_TO_STR(x) "D
3710: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
3720: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
3730: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
3740: 45 52 52 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  ERR_TO_STR(x) "D
3750: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
3760: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
3770: 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
3780: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
3790: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
37a0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
37b0: 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
37c0: 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47  TO_STR(x) "DEBUG
37d0: 5f 44 49 53 41 42 4c 45 44 22 0a 23 65 6e 64 69  _DISABLED".#endi
37e0: 66 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  f..struct cackey
37f0: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 7b  _pcsc_identity {
3800: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
3810: 61 70 70 6c 65 74 5b 37 5d 3b 0a 09 75 69 6e 74  applet[7];..uint
3820: 31 36 5f 74 20 66 69 6c 65 3b 0a 0a 09 73 69 7a  16_t file;...siz
3830: 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f  e_t certificate_
3840: 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  len;..unsigned c
3850: 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65  har *certificate
3860: 3b 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73  ;...ssize_t keys
3870: 69 7a 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ize;.};..struct 
3880: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
3890: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
38a0: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
38b0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a  pcsc_identity;..
38c0: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61  .CK_ATTRIBUTE *a
38d0: 74 74 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55  ttributes;..CK_U
38e0: 4c 4f 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f  LONG attributes_
38f0: 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63  count;.};..struc
3900: 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  t cackey_session
3910: 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a   {..int active;.
3920: 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
3930: 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20  tID;...CK_STATE 
3940: 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53  state;..CK_FLAGS
3950: 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e   flags;..CK_ULON
3960: 47 20 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b  G ulDeviceError;
3970: 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  ..CK_VOID_PTR pA
3980: 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f  pplication;..CK_
3990: 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a  NOTIFY Notify;..
39a0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
39b0: 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
39c0: 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
39d0: 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63  ong identities_c
39e0: 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72  ount;...int sear
39f0: 63 68 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41  ch_active;..CK_A
3a00: 54 54 52 49 42 55 54 45 5f 50 54 52 20 73 65 61  TTRIBUTE_PTR sea
3a10: 72 63 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55  rch_query;..CK_U
3a20: 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72  LONG search_quer
3a30: 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e  y_count;..unsign
3a40: 65 64 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63  ed long search_c
3a50: 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69  urr_id;...int si
3a60: 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d  gn_active;..CK_M
3a70: 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69  ECHANISM_TYPE si
3a80: 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43  gn_mechanism;..C
3a90: 4b 5f 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f  K_BYTE_PTR sign_
3aa0: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
3ab0: 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b  ong sign_buflen;
3ac0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3ad0: 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73  sign_bufused;..s
3ae0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
3af0: 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e  ntity *sign_iden
3b00: 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72  tity;...int decr
3b10: 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ypt_active;..CK_
3b20: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64  MECHANISM_TYPE d
3b30: 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
3b40: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64  ;..CK_VOID_PTR d
3b50: 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
3b60: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72  ;..CK_ULONG decr
3b70: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e  ypt_mech_parmlen
3b80: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
3b90: 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79  _identity *decry
3ba0: 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a  pt_identity;.};.
3bb0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  .struct cackey_s
3bc0: 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76  lot {..int activ
3bd0: 65 3b 0a 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  e;...char *pcsc_
3be0: 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63  reader;...int pc
3bf0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
3c00: 64 3b 0a 09 53 43 41 52 44 48 41 4e 44 4c 45 20  d;..SCARDHANDLE 
3c10: 70 63 73 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74  pcsc_card;...int
3c20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70   transaction_dep
3c30: 74 68 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72  th;...int slot_r
3c40: 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53  eset;...CK_FLAGS
3c50: 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09   token_flags;...
3c60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c  unsigned char *l
3c70: 61 62 65 6c 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65  abel;.};..typede
3c80: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
3c90: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
3ca0: 20 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59   = 0x01,..CACKEY
3cb0: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20  _TLV_APP_SKI    
3cc0: 20 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59   = 0x02,..CACKEY
3cd0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20  _TLV_APP_PKI    
3ce0: 20 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79   = 0x04.} cackey
3cf0: 5f 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74  _tlv_apptype;..t
3d00: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
3d10: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3d20: 47 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20  GENERALINFO     
3d30: 20 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43    = 0x2000,..CAC
3d40: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
3d50: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20  OPERSONALINFO   
3d60: 3d 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45  = 0x2100,..CACKE
3d70: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
3d80: 53 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20  SSCONTROL     = 
3d90: 30 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x3000,..CACKEY_
3da0: 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20  TLV_OBJID_LOGIN 
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78              = 0x
3dc0: 34 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  4000,..CACKEY_TL
3dd0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
3de0: 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 35 30            = 0x50
3df0: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
3e00: 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53  OBJID_BIOMETRICS
3e10: 20 20 20 20 20 20 20 20 3d 20 30 78 36 30 30 30          = 0x6000
3e20: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
3e30: 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45  JID_DIGITALSIGCE
3e40: 52 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a  RT    = 0x7000,.
3e50: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
3e60: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20  D_CAC_PERSON    
3e70: 20 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43      = 0x0200,..C
3e80: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3e90: 43 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20  CAC_BENEFITS    
3ea0: 20 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43    = 0x0202,..CAC
3eb0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3ec0: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20  C_OTHERBENEFITS 
3ed0: 3d 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45  = 0x0203,..CACKE
3ee0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3ef0: 50 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20  PERSONNEL     = 
3f00: 30 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f  0x0201,..CACKEY_
3f10: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
3f20: 49 43 45 52 54 20 20 20 20 20 20 20 3d 20 30 78  ICERT       = 0x
3f30: 30 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  02FE.} cackey_tl
3f40: 76 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70  v_objectid;..typ
3f50: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43  edef enum {..CAC
3f60: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
3f70: 50 52 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a  PRESENT    = 1,.
3f80: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  .CACKEY_PCSC_S_O
3f90: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  K              =
3fa0: 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   0,..CACKEY_PCSC
3fb0: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
3fc0: 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59     = -1,..CACKEY
3fd0: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20  _PCSC_E_BADPIN  
3fe0: 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43          = -2,..C
3ff0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
4000: 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d  KED          = -
4010: 33 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  3,..CACKEY_PCSC_
4020: 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20  E_NEEDLOGIN     
4030: 20 20 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f    = -4,..CACKEY_
4040: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
4050: 4e 54 20 20 20 20 20 3d 20 2d 36 0a 7d 20 63 61  NT     = -6.} ca
4060: 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63  ckey_ret;..struc
4070: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
4080: 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64  durl {..unsigned
4090: 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69 64   char        rid
40a0: 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  [5];..cackey_tlv
40b0: 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74 79  _apptype   appty
40c0: 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  pe;..cackey_tlv_
40d0: 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74  objectid  object
40e0: 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f  id;..cackey_tlv_
40f0: 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b  objectid  appid;
4100: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
4110: 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b         pinid;.};
4120: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
4130: 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75  tlv_entity;.stru
4140: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
4150: 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20  tity {..uint8_t 
4160: 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  tag;..size_t len
4170: 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09  gth;...union {..
4180: 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09  .void *value;...
4190: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
41a0: 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65  v_cardurl *value
41b0: 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74  _cardurl;...uint
41c0: 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a  8_t value_byte;.
41d0: 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  .};...struct cac
41e0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
41f0: 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41  _next;.};../* CA
4200: 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64  CKEY Global Hand
4210: 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  les */.static vo
4220: 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f  id *cackey_biglo
4230: 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69  ck = NULL;.stati
4240: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
4250: 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73  session cackey_s
4260: 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74  essions[128];.st
4270: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
4280: 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73  ey_slot cackey_s
4290: 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69  lots[128];.stati
42a0: 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69  c int cackey_ini
42b0: 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74  tialized = 0;.st
42c0: 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
42d0: 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30  biglock_init = 0
42e0: 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a  ;.CK_C_INITIALIZ
42f0: 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72  E_ARGS cackey_ar
4300: 67 73 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f  gs;../* PCSC Glo
4310: 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73  bal Handles */.s
4320: 74 61 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e  tatic LPSCARDCON
4330: 54 45 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63  TEXT cackey_pcsc
4340: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  _handle = NULL;.
4350: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
4360: 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74   long cackey_get
4370: 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a  version(void) {.
4380: 09 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
4390: 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32   long retval = 2
43a0: 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  55;..unsigned lo
43b0: 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75  ng major = 0;..u
43c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e  nsigned long min
43d0: 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d  or = 0;..char *m
43e0: 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b  ajor_str = NULL;
43f0: 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74  ..char *minor_st
4400: 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b  r = NULL;...CACK
4410: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4420: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
4430: 20 28 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29   (retval != 255)
4440: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
4450: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
4460: 69 6e 67 20 30 78 25 6c 78 20 28 63 61 63 68 65  ing 0x%lx (cache
4470: 64 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  d).", retval);..
4480: 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
4490: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  ;..}...retval = 
44a0: 30 3b 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41  0;..#ifdef PACKA
44b0: 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20  GE_VERSION.     
44c0: 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50     major_str = P
44d0: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a  ACKAGE_VERSION;.
44e0: 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20  .if (major_str) 
44f0: 7b 0a 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72  {..        major
4500: 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72   = strtoul(major
4510: 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72  _str, &minor_str
4520: 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69  , 10);....if (mi
4530: 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69  nor_str) {....mi
4540: 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69  nor = strtoul(mi
4550: 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c  nor_str + 1, NUL
4560: 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  L, 10);...}..}..
4570: 09 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72  .retval = (major
4580: 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72   << 16) | (minor
4590: 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a   << 8);.#endif..
45a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
45b0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
45c0: 30 78 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b  0x%lx", retval);
45d0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
45e0: 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52  );.}../* PC/SC R
45f0: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73  elated Functions
4600: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53   */./*. * SYNPOS
4610: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63  IS. *     void c
4620: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
4630: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29  onnect_all(void)
4640: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
4650: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
4660: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
4670: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
4680: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
4690: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69  This function di
46a0: 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61  sconnects from a
46b0: 6c 6c 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f  ll cards.. *. */
46c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
46d0: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
46e0: 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b  nect_all(void) {
46f0: 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a  ..uint32_t idx;.
4700: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4710: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
4720: 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
4730: 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
4740: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
4750: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
4760: 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ots[0])); idx++)
4770: 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
4780: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
4790: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
47a0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
47b0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44  G_PRINTF("SCardD
47c0: 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63  isconnect(%lu) c
47d0: 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65  alled", (unsigne
47e0: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09  d long) idx);...
47f0: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
4800: 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  t(cackey_slots[i
4810: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53  dx].pcsc_card, S
4820: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
4830: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
4840: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
4850: 61 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28  abel) {....free(
4860: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
4870: 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61  ].label);.....ca
4880: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
4890: 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
48a0: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
48b0: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
48c0: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
48d0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
48e0: 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
48f0: 64 65 70 74 68 20 3d 20 30 3b 0a 0a 09 09 69 66  depth = 0;....if
4900: 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
4910: 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
4920: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
4930: 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63  INTF("Marking ac
4940: 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73  tive slot %lu as
4950: 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28   being reset", (
4960: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
4970: 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  dx);...}....cack
4980: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c  ey_slots[idx].sl
4990: 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d  ot_reset = 1;..}
49a0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
49b0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
49c0: 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  g");...return;.}
49d0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
49e0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
49f0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63  et cackey_pcsc_c
4a00: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a  onnect(void);. *
4a10: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
4a20: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
4a30: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
4a40: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
4a50: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
4a60: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
4a70: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
4a80: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
4a90: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
4aa0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
4ab0: 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68  n connects to th
4ac0: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69  e PC/SC Connecti
4ad0: 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75  on Manager and u
4ae0: 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20  pdates the. *   
4af0: 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e    global handle.
4b00: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
4b10: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
4b20: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f  _pcsc_connect(vo
4b30: 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72  id) {..LONG scar
4b40: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4b50: 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  t;.#ifdef HAVE_S
4b60: 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45  CARDISVALIDCONTE
4b70: 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69  XT..LONG scard_i
4b80: 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64  svalid_ret;.#end
4b90: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
4ba0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
4bb0: 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  .");...if (cacke
4bc0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d  y_pcsc_handle ==
4bd0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
4be0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
4bf0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
4c00: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
4c10: 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65  e));...if (cacke
4c20: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d  y_pcsc_handle ==
4c30: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b   NULL) {....CACK
4c40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4c50: 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28  "Call to malloc(
4c60: 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  ) failed, return
4c70: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
4c80: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
4c90: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
4ca0: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  l();.....return(
4cb0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
4cc0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43  NERIC);...}....C
4cd0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4ce0: 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69  TF("SCardEstabli
4cf0: 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  shContext() call
4d00: 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73  ed");...scard_es
4d10: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20  t_context_ret = 
4d20: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
4d30: 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50  ntext(SCARD_SCOP
4d40: 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20  E_SYSTEM, NULL, 
4d50: 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73  NULL, cackey_pcs
4d60: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20  c_handle);...if 
4d70: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
4d80: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  xt_ret != SCARD_
4d90: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
4da0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4db0: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61  NTF("Call to SCa
4dc0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
4dd0: 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72  xt failed (retur
4de0: 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74  ned %s/%li), ret
4df0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
4e00: 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  e", CACKEY_DEBUG
4e10: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
4e20: 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f  O_STR(scard_est_
4e30: 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c  context_ret), (l
4e40: 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63  ong) scard_est_c
4e50: 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09  ontext_ret);....
4e60: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
4e70: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61  c_handle);....ca
4e80: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4e90: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63   = NULL;.....cac
4ea0: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
4eb0: 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09  nect_all();.....
4ec0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
4ed0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
4ee0: 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41  .}..}..#ifdef HA
4ef0: 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43  VE_SCARDISVALIDC
4f00: 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44  ONTEXT..CACKEY_D
4f10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
4f20: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
4f30: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63  () called");..sc
4f40: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20  ard_isvalid_ret 
4f50: 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f  = SCardIsValidCo
4f60: 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63  ntext(*cackey_pc
4f70: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20  sc_handle);..if 
4f80: 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72  (scard_isvalid_r
4f90: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
4fa0: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
4fb0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4fc0: 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d  Handle has becom
4fd0: 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64  e invalid (SCard
4fe0: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d  IsValidContext =
4ff0: 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67   %s/%li), trying
5000: 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68   to re-establish
5010: 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ...", CACKEY_DEB
5020: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
5030: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73  _TO_STR(scard_is
5040: 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e  valid_ret), (lon
5050: 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64  g) scard_isvalid
5060: 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  _ret);....CACKEY
5070: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
5080: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
5090: 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b  text() called");
50a0: 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  ...scard_est_con
50b0: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64  text_ret = SCard
50c0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
50d0: 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53  (SCARD_SCOPE_SYS
50e0: 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  TEM, NULL, NULL,
50f0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
5100: 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72  dle);...if (scar
5110: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
5120: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
5130: 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45  CESS) {....CACKE
5140: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5150: 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74  Call to SCardEst
5160: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61  ablishContext fa
5170: 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25  iled (returned %
5180: 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e  s/%li), returnin
5190: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43  g in failure", C
51a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
51b0: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
51c0: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
51d0: 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  xt_ret), (long) 
51e0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
51f0: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65  t_ret);.....free
5200: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
5210: 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  dle);....cackey_
5220: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
5230: 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  LL;.....cackey_s
5240: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
5250: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
5260: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
5270: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
5280: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5290: 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73  INTF("Handle has
52a0: 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69   been re-establi
52b0: 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69  shed");..}.#endi
52c0: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
52d0: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
52e0: 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74  ully connected t
52f0: 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69  o PC/SC, returni
5300: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b  ng in success");
5310: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5320: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
5330: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
5340: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
5350: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73   cackey_pcsc_dis
5360: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20  connect(void);. 
5370: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5380: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
5390: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
53a0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
53b0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
53c0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
53d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
53e0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
53f0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
5400: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
5410: 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66  on disconnects f
5420: 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f  rom the PC/SC Co
5430: 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72  nnection manager
5440: 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20   and updates. * 
5450: 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68      the global h
5460: 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  andle.. *. */.st
5470: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
5480: 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
5490: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09  onnect(void) {..
54a0: 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63  LONG scard_rel_c
54b0: 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41  ontext_ret;...CA
54c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
54d0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
54e0: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
54f0: 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  handle == NULL) 
5500: 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  {...return(CACKE
5510: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
5520: 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  ...scard_rel_con
5530: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64  text_ret = SCard
5540: 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a  ReleaseContext(*
5550: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5560: 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  le);...if (cacke
5570: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b  y_pcsc_handle) {
5580: 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
5590: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09  csc_handle);....
55a0: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  .cackey_pcsc_han
55b0: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  dle = NULL;..}..
55c0: 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63  .if (scard_rel_c
55d0: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43  ontext_ret != SC
55e0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
55f0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5600: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
5610: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41  ;..}...return(CA
5620: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
5630: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
5640: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
5650: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
5660: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
5670: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
5680: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
5690: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
56a0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
56b0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
56c0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
56d0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
56e0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
56f0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
5700: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
5710: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
5720: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
5730: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
5740: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
5750: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
5760: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
5770: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
5780: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
5790: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
57a0: 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  _ret pcsc_connec
57b0: 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 70 72  t_ret;..DWORD pr
57c0: 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63  otocol;..LONG sc
57d0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
57e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
57f0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
5800: 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09  ..if (!slot) {..
5810: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5820: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c  INTF("Invalid sl
5830: 6f 74 20 73 70 65 63 69 66 69 65 64 2c 20 72 65  ot specified, re
5840: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
5850: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
5860: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5870: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73  NERIC);..}...pcs
5880: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
5890: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
58a0: 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63  ect();..if (pcsc
58b0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
58c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
58d0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
58e0: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
58f0: 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66  ction to PC/SC f
5900: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
5910: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
5920: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5930: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
5940: 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74  ..}.../* Connect
5950: 20 74 6f 20 72 65 61 64 65 72 2c 20 69 66 20 6e   to reader, if n
5960: 65 65 64 65 64 20 2a 2f 0a 09 69 66 20 28 21 73  eeded */..if (!s
5970: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
5980: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41  onnected) {...CA
5990: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
59a0: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
59b0: 25 73 29 20 63 61 6c 6c 65 64 22 2c 20 73 6c 6f  %s) called", slo
59c0: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t->pcsc_reader);
59d0: 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
59e0: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
59f0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
5a00: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
5a10: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
5a20: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
5a30: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
5a40: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
5a50: 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T1, &slot->pcsc_
5a60: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
5a70: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  ;....if (scard_c
5a80: 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44  onn_ret != SCARD
5a90: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
5aa0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5ab0: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
5ac0: 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c   to card failed,
5ad0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
5ae0: 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e  ilure (SCardConn
5af0: 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22  ect() = %s/%li)"
5b00: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
5b10: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
5b20: 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  STR(scard_conn_r
5b30: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
5b40: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09  d_conn_ret);....
5b50: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5b60: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
5b70: 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73  ..}....slot->pcs
5b80: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
5b90: 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72   = 1;...slot->tr
5ba0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
5bb0: 3d 20 30 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  = 0;..}...return
5bc0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
5bd0: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
5be0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
5bf0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62  key_ret cackey_b
5c00: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
5c10: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
5c20: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
5c30: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
5c40: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
5c50: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
5c60: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
5c70: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
5c80: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
5c90: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
5ca0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
5cb0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
5cc0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
5cd0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
5ce0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
5cf0: 20 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69     The transacti
5d00: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65 72  on should be ter
5d10: 6d 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22 63  minated using "c
5d20: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
5d30: 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74  ction". *. */.st
5d40: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
5d50: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
5d60: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
5d70: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
5d80: 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
5d90: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74   cackey_conn_ret
5da0: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72  ;..LONG scard_tr
5db0: 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ans_ret;...CACKE
5dc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5dd0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61 63  Called.");...cac
5de0: 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63  key_conn_ret = c
5df0: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
5e00: 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 63  rd(slot);..if (c
5e10: 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 21  ackey_conn_ret !
5e20: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
5e30: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
5e40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
5e50: 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74  ble to connect t
5e60: 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e  o card, returnin
5e70: 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09  g in error");...
5e80: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5e90: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
5ea0: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .}...slot->trans
5eb0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a  action_depth++;.
5ec0: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
5ed0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
5ee0: 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  1) {...CACKEY_DE
5ef0: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 6c 72 65  BUG_PRINTF("Alre
5f00: 61 64 79 20 69 6e 20 61 20 74 72 61 6e 73 61 63  ady in a transac
5f10: 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e 67  tion, performing
5f20: 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77 20   no action (new 
5f30: 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c  depth = %i)", sl
5f40: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
5f50: 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72  depth);....retur
5f60: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
5f70: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f  OK);..}...scard_
5f80: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72  trans_ret = SCar
5f90: 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  dBeginTransactio
5fa0: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
5fb0: 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74  d);..if (scard_t
5fc0: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52  rans_ret != SCAR
5fd0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
5fe0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5ff0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
6000: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
6010: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
6020: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
6030: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6040: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
6050: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6060: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
6070: 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69   began transacti
6080: 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22  on on slot (%s)"
6090: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
60a0: 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  der);...return(C
60b0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
60c0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
60d0: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
60e0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64  y_ret cackey_end
60f0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
6100: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
6110: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
6120: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
6130: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
6140: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
6150: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
6160: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
6170: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
6180: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
6190: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
61a0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
61b0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
61c0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
61d0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
61e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71  his function req
61f0: 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65  uires "cackey_be
6200: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  gin_transaction"
6210: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69   to be called fi
6220: 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  rst. *. */.stati
6230: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
6240: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
6250: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
6260: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
6270: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e  .LONG scard_tran
6280: 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  s_ret;...CACKEY_
6290: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
62a0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
62b0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
62c0: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43  connected) {...C
62d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
62e0: 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20  TF("Card is not 
62f0: 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c  connected, unabl
6300: 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63  e to end transac
6310: 74 69 6f 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72  tion");....retur
6320: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
6330: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69  GENERIC);..}...i
6340: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
6350: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30 29  tion_depth == 0)
6360: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
6370: 47 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69 6e  G_PRINTF("Termin
6380: 61 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  ating a transact
6390: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ion that has not
63a0: 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72 65   begun!");....re
63b0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
63c0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
63d0: 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
63e0: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 69  ion_depth--;...i
63f0: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
6400: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
6410: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
6420: 5f 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61 63  _PRINTF("Transac
6430: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20 70  tions still in p
6440: 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65 72  rogress, not ter
6450: 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72 64  minating on-card
6460: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75   Transaction (cu
6470: 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69  rrent depth = %i
6480: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
6490: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
64a0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
64b0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
64c0: 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73  .}...scard_trans
64d0: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54  _ret = SCardEndT
64e0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d  ransaction(slot-
64f0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
6500: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
6510: 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f  if (scard_trans_
6520: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6530: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
6540: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6550: 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74  "Unable to end t
6560: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75  ransaction, retu
6570: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
6580: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
6590: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
65a0: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
65b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
65c0: 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e  cessfully termin
65d0: 61 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ated transaction
65e0: 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20   on slot (%s)", 
65f0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
6600: 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  r);...return(CAC
6610: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
6620: 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74  }../* APDU Relat
6630: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ed Functions */.
6640: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
6650: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
6660: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
6670: 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  u(struct cackey_
6680: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
6690: 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c  gned char class,
66a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
66b0: 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69  nstruction, unsi
66c0: 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e  gned char p1, un
66d0: 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20  signed char p2, 
66e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63  unsigned char lc
66f0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6700: 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20  *data, unsigned 
6710: 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f  char le, uint16_
6720: 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73  t *respcode, uns
6730: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
6740: 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65  data, size_t *re
6750: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a  spdata_len);. *.
6760: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
6770: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
6780: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
6790: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
67a0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
67b0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
67c0: 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20  r class. *      
67d0: 20 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47     APDU Class (G
67e0: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
67f0: 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53  16 or GSCIS_CLAS
6800: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
6810: 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75  M. *         usu
6820: 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a  ally), (CLA). *.
6830: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
6840: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
6850: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
6860: 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e   Instruction (IN
6870: 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  S). *. *     uns
6880: 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a  igned char p1. *
6890: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61           APDU Pa
68a0: 72 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20  rameter 1 (P1). 
68b0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
68c0: 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20  d char p2. *    
68d0: 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65       APDU Parame
68e0: 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a  ter 2 (P2). *. *
68f0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
6900: 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20  ar lc. *        
6910: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20   APDU Length of 
6920: 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20  Content (Lc) -- 
6930: 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67  this is the leng
6940: 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20  th of "data". * 
6950: 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65          paramete
6960: 72 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73  r.  If "data" is
6970: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
6980: 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74  LL, this paramet
6990: 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20  er will. *      
69a0: 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20     be ignored.. 
69b0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
69c0: 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20  d char *data. * 
69d0: 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20          Pointer 
69e0: 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e  to buffer to sen
69f0: 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65  d.  It should be
6a00: 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67   "Lc" bytes long
6a10: 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20  .  If. *        
6a20: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
6a30: 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f  LL, "Lc" will no
6a40: 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74  t be sent, and t
6a50: 68 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20  his buffer will 
6a60: 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67  be. *         ig
6a70: 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  nored.. *. *    
6a80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
6a90: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  e. *         APD
6aa0: 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65  U Length of Expe
6ab0: 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20  ctation (Le) -- 
6ac0: 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67  this is the leng
6ad0: 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20  th of the. *    
6ae0: 20 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65       expected re
6af0: 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73  ply.  If this is
6b00: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20   specified as 0 
6b10: 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74  then it will not
6b20: 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73  . *         be s
6b30: 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  ent.. *. *     u
6b40: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
6b50: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  e. *         [OU
6b60: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  T] Pointer to st
6b70: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65  orage of APDU re
6b80: 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66  sponse code.  If
6b90: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20   this is. *     
6ba0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
6bb0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f   NULL, the respo
6bc0: 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  nse code will be
6bd0: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20   discarded.. *. 
6be0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
6bf0: 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a  har *respdata. *
6c00: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50           [OUT] P
6c10: 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67  ointer to storag
6c20: 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e  e of APDU respon
6c30: 73 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69  se data.  If thi
6c40: 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20  s is. *         
6c50: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
6c60: 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20  L, the response 
6c70: 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73  data will be dis
6c80: 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20  carded.  If. *  
6c90: 20 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70         the "resp
6ca0: 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65  data_len" parame
6cb0: 74 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64  ter is specified
6cc0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62   as NULL, this b
6cd0: 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20  uffer. *        
6ce0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
6cf0: 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ated.. *. *     
6d00: 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61  size_t *respdata
6d10: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
6d20: 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65  [IN, OUT] Pointe
6d30: 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e  r initialing con
6d40: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65  taining the size
6d50: 20 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74   of the "respdat
6d60: 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75  a". *         bu
6d70: 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65  ffer.  Before re
6d80: 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69  turning, the poi
6d90: 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73  nted to value is
6da0: 20 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a   updated to the.
6db0: 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65   *         numbe
6dc0: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
6dd0: 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  en to the buffer
6de0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70  .  If this is sp
6df0: 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20  ecified as. *   
6e00: 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77        NULL, it w
6e10: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
6e20: 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74  ed, and "respdat
6e30: 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  a" will be ignor
6e40: 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20  ed causing. *   
6e50: 20 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e        the respon
6e60: 73 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69  se data to be di
6e70: 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52  scarded.. *. * R
6e80: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
6e90: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
6ea0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e  _OK           On
6eb0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
6ec0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6ed0: 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72  NERIC      On er
6ee0: 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ror. *     CACKE
6ef0: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
6f00: 53 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e  SENT  If the sen
6f10: 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61  ding failed beca
6f20: 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73  use the token is
6f30: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f50: 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a 20     absent. *. * 
6f60: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
6f70: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
6f80: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50  connect to the P
6f90: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
6fa0: 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20  Manager via. *  
6fb0: 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63     cackey_pcsc_c
6fc0: 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64  onnect() if need
6fd0: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74  ed.. *. *     It
6fe0: 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f   will connect to
6ff0: 20 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65   the card in the
7000: 20 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64   reader attached
7010: 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20   to the slot. * 
7020: 20 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20      specified.  
7030: 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63  It will reconnec
7040: 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66  t to the card if
7050: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   the connection.
7060: 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79   *     goes away
7070: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
7080: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
7090: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75  y_send_apdu(stru
70a0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
70b0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
70c0: 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67  har class, unsig
70d0: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63  ned char instruc
70e0: 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63  tion, unsigned c
70f0: 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64  har p1, unsigned
7100: 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e   char p2, unsign
7110: 65 64 20 63 68 61 72 20 6c 63 2c 20 75 6e 73 69  ed char lc, unsi
7120: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c  gned char *data,
7130: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
7140: 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73  e, uint16_t *res
7150: 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20  pcode, unsigned 
7160: 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20  char *respdata, 
7170: 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61  size_t *respdata
7180: 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74  _len) {..uint8_t
7190: 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72   major_rc, minor
71a0: 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74  _rc;..size_t byt
71b0: 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f  es_to_copy, tmp_
71c0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 44  respdata_len;..D
71d0: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
71e0: 44 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20  DWORD xmit_len, 
71f0: 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20  recv_len;..LONG 
7200: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20  scard_xmit_ret, 
7210: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
7220: 3b 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66  ;..BYTE xmit_buf
7230: 5b 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66  [1024], recv_buf
7240: 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73  [1024];..int pcs
7250: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70  c_connect_ret, p
7260: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b  csc_getresp_ret;
7270: 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43  ..int idx;...CAC
7280: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7290: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
72a0: 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41  f (!slot) {...CA
72b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
72c0: 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  F("Invalid slot 
72d0: 73 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09  specified.");...
72e0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
72f0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
7300: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
7310: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
7320: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
7330: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
7340: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
7350: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
7360: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7370: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
7380: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
7390: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
73a0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
73b0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
73c0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
73d0: 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a 2f 0a  ./* Transmit */.
73e0: 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09  .xmit_len = 0;..
73f0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
7400: 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a 09 78  n++] = class;..x
7410: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
7420: 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74 69 6f  ++] = instructio
7430: 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  n;..xmit_buf[xmi
7440: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09  t_len++] = p1;..
7450: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
7460: 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66 20 28  n++] = p2;..if (
7470: 64 61 74 61 29 20 7b 0a 09 09 78 6d 69 74 5f 62  data) {...xmit_b
7480: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
7490: 20 6c 63 3b 0a 09 09 66 6f 72 20 28 69 64 78 20   lc;...for (idx 
74a0: 3d 20 30 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69  = 0; idx < lc; i
74b0: 64 78 2b 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f  dx++) {....xmit_
74c0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
74d0: 3d 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d  = data[idx];...}
74e0: 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20  ..}...if (le != 
74f0: 30 78 30 30 29 20 7b 0a 09 09 78 6d 69 74 5f 62  0x00) {...xmit_b
7500: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
7510: 20 6c 65 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67   le;..}.../* Beg
7520: 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  in Smartcard Tra
7530: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
7540: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
7550: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69  ction(slot);...i
7560: 66 20 28 63 6c 61 73 73 20 3d 3d 20 47 53 43 49  f (class == GSCI
7570: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20  S_CLASS_ISO7816 
7580: 26 26 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d  && instruction =
7590: 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45  = GSCIS_INSTR_VE
75a0: 52 49 46 59 20 26 26 20 70 31 20 3d 3d 20 30 78  RIFY && p1 == 0x
75b0: 30 30 20 26 26 20 70 32 20 3d 3d 20 30 78 30 30  00 && p2 == 0x00
75c0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
75d0: 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6e 64 69  UG_PRINTF("Sendi
75e0: 6e 67 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f  ng APDU: <<censo
75f0: 72 65 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65  red>>");..} else
7600: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7610: 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64  G_PRINTBUF("Send
7620: 69 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74  ing APDU:", xmit
7630: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b  _buf, xmit_len);
7640: 0a 09 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d  ..}...recv_len =
7650: 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66   sizeof(recv_buf
7660: 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f 72  );..scard_xmit_r
7670: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d  et = SCardTransm
7680: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  it(slot->pcsc_ca
7690: 72 64 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 30  rd, SCARD_PCI_T0
76a0: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
76b0: 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76  _len, NULL, recv
76c0: 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29  _buf, &recv_len)
76d0: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69  ;..if (scard_xmi
76e0: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
76f0: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41  _SUCCESS) {...CA
7700: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7710: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e  F("Failed to sen
7720: 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28  d APDU to card (
7730: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20  SCardTransmit() 
7740: 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b  = %s/%lx)", CACK
7750: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
7760: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
7770: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28  ard_xmit_ret), (
7780: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
7790: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a  card_xmit_ret);.
77a0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
77b0: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 73  RINTF("Marking s
77c0: 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62 65  lot as having be
77d0: 65 6e 20 72 65 73 65 74 22 29 3b 0a 0a 09 09 73  en reset");....s
77e0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
77f0: 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c  _depth = 0;...sl
7800: 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ot->slot_reset =
7810: 20 31 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64   1;....if (scard
7820: 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41  _xmit_ret == SCA
7830: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29  RD_W_RESET_CARD)
7840: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
7850: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
7860: 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73   required, pleas
7870: 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09  e hold...");....
7880: 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  .scard_reconn_re
7890: 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t = SCardReconne
78a0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
78b0: 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  rd, SCARD_SHARE_
78c0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
78d0: 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
78e0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53  D_PROTOCOL_T1, S
78f0: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c  CARD_RESET_CARD,
7900: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09   &protocol);....
7910: 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e  if (scard_reconn
7920: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
7930: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f  SUCCESS) {...../
7940: 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74  * Re-establish t
7950: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69  ransaction, if i
7960: 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f  t was present */
7970: 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .....if (slot->t
7980: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
7990: 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f   > 0) {......slo
79a0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
79b0: 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61 63  epth--;......cac
79c0: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
79d0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09  ction(slot);....
79e0: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
79f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
7a00: 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  et successful, r
7a10: 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b  etransmitting");
7a20: 0a 0a 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d  ......recv_len =
7a30: 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66   sizeof(recv_buf
7a40: 29 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69  );.....scard_xmi
7a50: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61  t_ret = SCardTra
7a60: 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nsmit(slot->pcsc
7a70: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 50 43 49  _card, SCARD_PCI
7a80: 5f 54 30 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  _T0, xmit_buf, x
7a90: 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72  mit_len, NULL, r
7aa0: 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c  ecv_buf, &recv_l
7ab0: 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63  en);......if (sc
7ac0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20  ard_xmit_ret != 
7ad0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
7ae0: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
7af0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
7b00: 72 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20  ransmit failed, 
7b10: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
7b20: 6c 75 72 65 20 61 66 74 65 72 20 64 69 73 63 6f  lure after disco
7b30: 6e 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61 72  nnecting the car
7b40: 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74  d (SCardTransmit
7b50: 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43   = %s/%li)", CAC
7b60: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
7b70: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
7b80: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
7b90: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69  (long) scard_xmi
7ba0: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43  t_ret);.......SC
7bb0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c  ardDisconnect(sl
7bc0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7bd0: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 29  CARD_RESET_CARD)
7be0: 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73  ;......slot->pcs
7bf0: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
7c00: 20 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45   = 0;......./* E
7c10: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
7c20: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  nsaction */.....
7c30: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
7c40: 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09  on_depth = 1;...
7c50: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
7c60: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
7c70: 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41  .......return(CA
7c80: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
7c90: 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a  NABSENT);.....}.
7ca0: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
7cb0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7cc0: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
7cd0: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09  ng card");......
7ce0: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
7cf0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7d00: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
7d10: 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63  D);.....slot->pc
7d20: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
7d30: 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45  d = 0;....../* E
7d40: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
7d50: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  nsaction */.....
7d60: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7d70: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
7d80: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
7d90: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
7da0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7db0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
7dc0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
7dd0: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
7de0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
7df0: 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d  BSENT);....}...}
7e00: 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
7e10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7e20: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61  Disconnecting ca
7e30: 72 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64 44  rd");.....SCardD
7e40: 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  isconnect(slot->
7e50: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
7e60: 5f 52 45 53 45 54 5f 43 41 52 44 29 3b 0a 09 09  _RESET_CARD);...
7e70: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
7e80: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
7e90: 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
7ea0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
7eb0: 20 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61   */....slot->tra
7ec0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
7ed0: 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e   1;....cackey_en
7ee0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
7ef0: 6f 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ot);.....CACKEY_
7f00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
7f10: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
7f20: 72 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28  re");....return(
7f30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
7f40: 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a  KENABSENT);...}.
7f50: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
7f60: 47 5f 50 52 49 4e 54 42 55 46 28 22 52 65 74 75  G_PRINTBUF("Retu
7f70: 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20 72 65  rned Value:", re
7f80: 63 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65 6e  cv_buf, recv_len
7f90: 29 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c 65  );...if (recv_le
7fa0: 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d 69  n < 2) {.../* Mi
7fb0: 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20 6c  nimal response l
7fc0: 65 6e 67 74 68 20 69 73 20 32 20 62 79 74 65 73  ength is 2 bytes
7fd0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
7fe0: 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43 4b  ailure */...CACK
7ff0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8000: 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73 6d  "Response too sm
8010: 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  all, returning i
8020: 6e 20 66 61 69 6c 75 72 65 20 28 72 65 63 76 5f  n failure (recv_
8030: 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e  len = %lu)", (un
8040: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63  signed long) rec
8050: 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e  v_len);..../* En
8060: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
8070: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  saction */...cac
8080: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
8090: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65  ion(slot);....re
80a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
80b0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
80c0: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 72  ../* Determine r
80d0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09 6d  esult code */..m
80e0: 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62  ajor_rc = recv_b
80f0: 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32 5d  uf[recv_len - 2]
8100: 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72 65  ;..minor_rc = re
8110: 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20  cv_buf[recv_len 
8120: 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65 73 70 63  - 1];..if (respc
8130: 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f  ode) {...*respco
8140: 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20 3c  de = (major_rc <
8150: 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b  < 8) | minor_rc;
8160: 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74 20  ..}.../* Adjust 
8170: 6d 65 73 73 61 67 65 20 62 75 66 66 65 72 20 2a  message buffer *
8180: 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20 32  /..recv_len -= 2
8190: 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74 65 73  ;.../* Add bytes
81a0: 20 74 6f 20 72 65 74 75 72 6e 20 76 61 6c 75 65   to return value
81b0: 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61 74   */..tmp_respdat
81c0: 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28  a_len = 0;..if (
81d0: 72 65 73 70 64 61 74 61 20 26 26 20 72 65 73 70  respdata && resp
81e0: 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d  data_len) {...tm
81f0: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d  p_respdata_len =
8200: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a   *respdata_len;.
8210: 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
8220: 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e   = *respdata_len
8230: 3b 0a 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65  ;....if (recv_le
8240: 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  n < bytes_to_cop
8250: 79 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f  y) {....bytes_to
8260: 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65 6e  _copy = recv_len
8270: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
8280: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
8290: 70 79 69 6e 67 20 25 6c 75 20 62 79 74 65 73 20  pying %lu bytes 
82a0: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 28 72  to the buffer (r
82b0: 65 63 76 27 64 20 25 6c 75 20 62 79 74 65 73 2c  ecv'd %lu bytes,
82c0: 20 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20 62 79   but only %lu by
82d0: 74 65 73 20 6c 65 66 74 20 69 6e 20 6f 75 72 20  tes left in our 
82e0: 62 75 66 66 65 72 29 22 2c 20 28 75 6e 73 69 67  buffer)", (unsig
82f0: 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f  ned long) bytes_
8300: 74 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69 67 6e  to_copy, (unsign
8310: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
8320: 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
8330: 67 29 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  g) *respdata_len
8340: 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65 73  );....memcpy(res
8350: 70 64 61 74 61 2c 20 72 65 63 76 5f 62 75 66 2c  pdata, recv_buf,
8360: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b   bytes_to_copy);
8370: 0a 09 09 72 65 73 70 64 61 74 61 20 2b 3d 20 62  ...respdata += b
8380: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09  ytes_to_copy;...
8390: 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d  .*respdata_len =
83a0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
83b0: 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  ..tmp_respdata_l
83c0: 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63  en -= bytes_to_c
83d0: 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  opy;..} else {..
83e0: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d  .if (recv_len !=
83f0: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
8400: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68  DEBUG_PRINTF("Th
8410: 72 6f 77 69 6e 67 20 61 77 61 79 20 25 6c 75 20  rowing away %lu 
8420: 62 79 74 65 73 2c 20 6e 6f 77 68 65 72 65 20 74  bytes, nowhere t
8430: 6f 20 70 75 74 20 74 68 65 6d 21 22 2c 20 28 75  o put them!", (u
8440: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
8450: 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a  cv_len);...}..}.
8460: 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d  ..if (major_rc =
8470: 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57  = 0x61) {.../* W
8480: 65 20 6e 65 65 64 20 74 6f 20 52 45 41 44 20 2a  e need to READ *
8490: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
84a0: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
84b0: 72 65 61 64 20 72 65 71 75 69 72 65 64 22 29 3b  read required");
84c0: 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 72 63  ....if (minor_rc
84d0: 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 6d   == 0x00) {....m
84e0: 69 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b 45 59  inor_rc = CACKEY
84f0: 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a  _APDU_MTU;...}..
8500: 09 09 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72  ..pcsc_getresp_r
8510: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
8520: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
8530: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
8540: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54   GSCIS_INSTR_GET
8550: 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c  _RESPONSE, 0x00,
8560: 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20   0x00, 0, NULL, 
8570: 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f  minor_rc, respco
8580: 64 65 2c 20 72 65 73 70 64 61 74 61 2c 20 26 74  de, respdata, &t
8590: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  mp_respdata_len)
85a0: 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 67 65 74  ;...if (pcsc_get
85b0: 72 65 73 70 5f 72 65 74 20 21 3d 20 43 41 43 4b  resp_ret != CACK
85c0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
85d0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
85e0: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72  PRINTF("Buffer r
85f0: 65 61 64 20 66 61 69 6c 65 64 21 20 20 52 65 74  ead failed!  Ret
8600: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
8610: 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  e");...../* End 
8620: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
8630: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ction */....cack
8640: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
8650: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65  on(slot);.....re
8660: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
8670: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
8680: 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 61  ....if (respdata
8690: 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70  _len) {....*resp
86a0: 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f  data_len += tmp_
86b0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09  respdata_len;...
86c0: 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  }..../* End Smar
86d0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
86e0: 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e  n */...cackey_en
86f0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
8700: 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ot);....CACKEY_D
8710: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
8720: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
8730: 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63  s (buffer read c
8740: 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65  omplete)");...re
8750: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
8760: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  _S_OK);..}.../* 
8770: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
8780: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
8790: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
87a0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66  tion(slot);...if
87b0: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
87c0: 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65  90) {.../* Succe
87d0: 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  ss */...CACKEY_D
87e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
87f0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
8800: 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78  s (major_rc = 0x
8810: 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  90)");....return
8820: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
8830: 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59  K);..}....CACKEY
8840: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
8850: 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20  PDU Returned an 
8860: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67  error, returning
8870: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
8880: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8890: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
88a0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
88b0: 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74  S. *     ssize_t
88c0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
88d0: 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65  fer(struct cacke
88e0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
88f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
8900: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  fer, size_t coun
8910: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
8920: 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20   t_or_v, size_t 
8930: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b  initial_offset);
8940: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
8950: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
8960: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8970: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
8980: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
8990: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
89a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
89b0: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
89c0: 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a  [OUT] Buffer. *.
89d0: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f   *     size_t co
89e0: 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e  unt. *         N
89f0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
8a00: 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  o attempt to rea
8a10: 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  d. *. *     unsi
8a20: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
8a30: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65  . *         Sele
8a40: 63 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20  ct the T-buffer 
8a50: 28 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72  (01) or V-buffer
8a60: 20 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72   (02) to read fr
8a70: 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20  om.  . *. *     
8a80: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
8a90: 66 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20  ffset. *        
8aa0: 20 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66   Specify the off
8ab0: 73 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65  set to begin the
8ac0: 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a   read from. *. *
8ad0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
8ae0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
8af0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
8b00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8b10: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c  s actually read,
8b20: 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e   or -1 on error.
8b30: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
8b40: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a      None. *. */.
8b50: 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
8b60: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
8b70: 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  r(struct cackey_
8b80: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
8b90: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
8ba0: 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c  r, size_t count,
8bb0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
8bc0: 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e  _or_v, size_t in
8bd0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a  itial_offset) {.
8be0: 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d  .size_t offset =
8bf0: 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20   0, max_offset, 
8c00: 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69  max_count;..unsi
8c10: 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d  gned char cmd[2]
8c20: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
8c30: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  code;..int send_
8c40: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
8c50: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
8c60: 65 64 2e 22 29 3b 0a 0a 09 6d 61 78 5f 6f 66 66  ed.");...max_off
8c70: 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61  set = count;..ma
8c80: 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59  x_count = CACKEY
8c90: 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20  _APDU_MTU;...if 
8ca0: 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20  (t_or_v != 1 && 
8cb0: 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09  t_or_v != 2) {..
8cc0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8cd0: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20  INTF("Invalid T 
8ce0: 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72 20 73  or V parameter s
8cf0: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e  pecified, return
8d00: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
8d10: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
8d20: 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74  ..}...cmd[0] = t
8d30: 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28  _or_v;...while (
8d40: 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65  1) {...if (offse
8d50: 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29  t >= max_offset)
8d60: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8d70: 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65  UG_PRINTF("Buffe
8d80: 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74  r too small, ret
8d90: 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67  urning what we g
8da0: 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65  ot...");.....bre
8db0: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74  ak;...}....count
8dc0: 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20   = max_offset - 
8dd0: 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f  offset;...if (co
8de0: 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29  unt > max_count)
8df0: 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61   {....count = ma
8e00: 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09  x_count;...}....
8e10: 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a  cmd[1] = count;.
8e20: 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
8e30: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
8e40: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
8e50: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
8e60: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45  , GSCIS_INSTR_RE
8e70: 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69  AD_BUFFER, ((ini
8e80: 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66  tial_offset + of
8e90: 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78  fset) >> 8) & 0x
8ea0: 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66  ff, (initial_off
8eb0: 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20  set + offset) & 
8ec0: 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64  0xff, sizeof(cmd
8ed0: 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72  ), cmd, 0x00, &r
8ee0: 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20  espcode, buffer 
8ef0: 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74  + offset, &count
8f00: 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
8f10: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
8f20: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28  _S_OK) {....if (
8f30: 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41  respcode == 0x6A
8f40: 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61  86) {.....if (ma
8f50: 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a  x_count == 1) {.
8f60: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
8f70: 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74  }......max_count
8f80: 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32   = max_count / 2
8f90: 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
8fa0: 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59  ....}.....CACKEY
8fb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
8fc0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
8fd0: 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  ) failed, return
8fe0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
8ff0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
9000: 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20  ;...}....offset 
9010: 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20  += count;....if 
9020: 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75  (count < max_cou
9030: 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  nt) {....CACKEY_
9040: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68  DEBUG_PRINTF("Sh
9050: 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e  ort read -- coun
9060: 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d  t = %i, cmd[1] =
9070: 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e   %i", (int) coun
9080: 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29  t, (int) cmd[1])
9090: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
90a0: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
90b0: 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
90c0: 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
90d0: 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65  E_MAX..if (offse
90e0: 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  t > _POSIX_SSIZE
90f0: 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59  _MAX) {...CACKEY
9100: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
9110: 66 66 73 65 74 20 65 78 63 65 65 64 73 20 6d 61  ffset exceeds ma
9120: 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
9130: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
9140: 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
9150: 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28  ffset = %lu)", (
9160: 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49  long) _POSIX_SSI
9170: 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65  ZE_MAX, (unsigne
9180: 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b  d long) offset);
9190: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
91a0: 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .}.#  endif.#end
91b0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
91c0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
91d0: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
91e0: 72 65 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c  read %lu bytes",
91f0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
9200: 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75   offset);...retu
9210: 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  rn(offset);.}../
9220: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
9230: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
9240: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
9250: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  plet(struct cack
9260: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
9270: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
9280: 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65  d, size_t aid_le
9290: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
92a0: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
92b0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
92c0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
92d0: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
92e0: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
92f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9300: 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20  *aid. *         
9310: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
9320: 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73  g Applet ID to s
9330: 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20  elect. *. *     
9340: 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20  size_t aid_len. 
9350: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
9360: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
9370: 20 22 61 69 64 22 20 28 41 70 70 6c 65 74 20 49   "aid" (Applet I
9380: 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a  D) parameter. *.
9390: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
93a0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
93b0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
93c0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
93d0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
93e0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
93f0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
9400: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
9410: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
9420: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65  _ret cackey_sele
9430: 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74  ct_applet(struct
9440: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
9450: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
9460: 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61  r *aid, size_t a
9470: 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73  id_len) {..int s
9480: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  end_ret;...CACKE
9490: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
94a0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43  Called.");...CAC
94b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
94c0: 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70  UF("Selecting ap
94d0: 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64  plet:", aid, aid
94e0: 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65  _len);...send_re
94f0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
9500: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
9510: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
9520: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
9530: 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f  CT, GSCIS_PARAM_
9540: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30  SELECT_APPLET, 0
9550: 78 30 43 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69  x0C, aid_len, ai
9560: 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e  d, 0x00, NULL, N
9570: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
9580: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
9590: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
95a0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
95b0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
95c0: 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72  o open applet, r
95d0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
95e0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
95f0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
9600: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
9610: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9620: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
9630: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b  selected file");
9640: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9650: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
9660: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
9670: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
9680: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
9690: 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65  ile(struct cacke
96a0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69  y_slot *slot, ui
96b0: 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20  nt16_t ef);. *. 
96c0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
96d0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
96e0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
96f0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
9700: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
9710: 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36   *. *     uint16
9720: 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20  _t ef. *        
9730: 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20   Elemental File 
9740: 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20  to select. *. * 
9750: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
9760: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
9770: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
9780: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
9790: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
97a0: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
97b0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
97c0: 20 20 20 20 54 68 69 73 20 73 65 6c 65 63 74 73      This selects
97d0: 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46   an Elementary F
97e0: 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20 74  ile (EF) under t
97f0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c  he currently sel
9800: 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64  ected. *     Ded
9810: 69 63 61 74 65 64 20 46 69 6c 65 20 28 44 46 29  icated File (DF)
9820: 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63  . *. *     Typic
9830: 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c  ally this is cal
9840: 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65 63 74  led after select
9850: 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74 20  ing the correct 
9860: 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a  Applet (using. *
9870: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65       cackey_sele
9880: 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56  ct_applet) for V
9890: 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73  M cards. *. */.s
98a0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
98b0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
98c0: 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65  ile(struct cacke
98d0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69  y_slot *slot, ui
98e0: 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e  nt16_t ef) {..un
98f0: 73 69 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f  signed char fid_
9900: 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e  buf[2];..int sen
9910: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
9920: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
9930: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70  lled.");.../* Op
9940: 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72  en the elementar
9950: 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62  y file */..fid_b
9960: 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38  uf[0] = (ef >> 8
9970: 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62  ) & 0xff;..fid_b
9980: 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66  uf[1] = ef & 0xf
9990: 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  f;...CACKEY_DEBU
99a0: 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74  G_PRINTF("Select
99b0: 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22  ing file: %04lx"
99c0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
99d0: 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65  ) ef);...send_re
99e0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
99f0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
9a00: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
9a10: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
9a20: 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20  CT, 0x02, 0x0C, 
9a30: 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c  sizeof(fid_buf),
9a40: 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20   fid_buf, 0x00, 
9a50: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
9a60: 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  );..if (send_ret
9a70: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
9a80: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
9a90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
9aa0: 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69  ailed to open fi
9ab0: 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  le, returning in
9ac0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
9ad0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9ae0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9af0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9b00: 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66  PRINTF("Successf
9b10: 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69  ully selected fi
9b20: 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  le");...return(C
9b30: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
9b40: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
9b50: 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20  SIS. *     void 
9b60: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
9b70: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
9b80: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b  v_entity *root);
9b90: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
9ba0: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
9bb0: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
9bc0: 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20   *root. *       
9bd0: 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c    Root of the TL
9be0: 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20  V list to start 
9bf0: 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45  freeing. *. * RE
9c00: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
9c10: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54    None. *. * NOT
9c20: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
9c30: 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68  unction frees th
9c40: 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73  e TLV linked lis
9c50: 74 65 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f  ted returned fro
9c60: 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79  m. *     "cackey
9c70: 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a  _read_tlv". *. *
9c80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
9c90: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
9ca0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
9cb0: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a  entity *root) {.
9cc0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
9cd0: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c  lv_entity *curr,
9ce0: 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f   *next;...if (ro
9cf0: 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ot == NULL) {...
9d00: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
9d10: 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63   (curr = root; c
9d20: 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74  urr; curr = next
9d30: 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72  ) {...next = cur
9d40: 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69  r->_next;....swi
9d50: 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20  tch (curr->tag) 
9d60: 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  {....case GSCIS_
9d70: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
9d80: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
9d90: 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09  _CERTIFICATE:...
9da0: 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75  ..if (curr->valu
9db0: 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  e) {......free(c
9dc0: 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09  urr->value);....
9dd0: 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
9de0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
9df0: 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20  CARDURL:.....if 
9e00: 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  (curr->value_car
9e10: 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65  durl) {......fre
9e20: 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  e(curr->value_ca
9e30: 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09  rdurl);.....}...
9e40: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
9e50: 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a  free(curr);..}..
9e60: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
9e70: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
9e80: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
9e90: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
9ea0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
9eb0: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
9ec0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
9ed0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
9ee0: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
9ef0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61  y_tlv_entity *ca
9f00: 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74  ckey_read_tlv(st
9f10: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
9f20: 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63   *slot) {..struc
9f30: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
9f40: 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79  ity *curr_entity
9f50: 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20  , *root = NULL, 
9f60: 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75  *last = NULL;..u
9f70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65  nsigned char tle
9f80: 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62  n_buf[2], tval_b
9f90: 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b  uf[1024], *tval;
9fa0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
9fb0: 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61  vlen_buf[2], vva
9fc0: 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76  l_buf[8192], *vv
9fd0: 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  al;..unsigned ch
9fe0: 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 73 73 69  ar *tmpbuf;..ssi
9ff0: 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b  ze_t tlen, vlen;
a000: 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72  ..ssize_t read_r
a010: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73  et;..size_t offs
a020: 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65 74  et_t = 0, offset
a030: 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65  _v = 0;..unsigne
a040: 64 20 63 68 61 72 20 74 61 67 3b 0a 09 73 69 7a  d char tag;..siz
a050: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66 64  e_t length;.#ifd
a060: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 75 4c  ef HAVE_LIBZ..uL
a070: 6f 6e 67 66 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  ongf tmpbuflen;.
a080: 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f  .int uncompress_
a090: 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ret;.#endif...CA
a0a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a0b0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
a0c0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
a0d0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
a0e0: 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, tlen_buf, si
a0f0: 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20  zeof(tlen_buf), 
a100: 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69  1, offset_t);..i
a110: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
a120: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29  izeof(tlen_buf))
a130: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
a140: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
a150: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
a160: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
a170: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
a180: 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65  .}...tlen = (tle
a190: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
a1a0: 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   tlen_buf[0];...
a1b0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
a1c0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
a1d0: 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, vlen_buf, si
a1e0: 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20  zeof(vlen_buf), 
a1f0: 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69  2, offset_v);..i
a200: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
a210: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29  izeof(vlen_buf))
a220: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
a230: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
a240: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
a250: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
a260: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
a270: 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65  .}...vlen = (vle
a280: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
a290: 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   vlen_buf[0];...
a2a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a2b0: 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20  NTF("Tag Length 
a2c0: 3d 20 25 69 2c 20 56 61 6c 75 65 20 4c 65 6e 67  = %i, Value Leng
a2d0: 74 68 20 3d 20 25 69 22 2c 20 74 6c 65 6e 2c 20  th = %i", tlen, 
a2e0: 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f  vlen);...offset_
a2f0: 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f  t += 2;..offset_
a300: 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c  v += 2;...if (tl
a310: 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c  en > sizeof(tval
a320: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
a330: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a340: 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f  Tag length is to
a350: 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69  o large, returni
a360: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
a370: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
a380: 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20  ;..}...if (vlen 
a390: 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75  > sizeof(vval_bu
a3a0: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
a3b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c  EBUG_PRINTF("Val
a3c0: 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ue length is too
a3d0: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
a3e0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a3f0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
a400: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
a410: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
a420: 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62  fer(slot, tval_b
a430: 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66  uf, tlen, 1, off
a440: 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61  set_t);..if (rea
a450: 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b  d_ret != tlen) {
a460: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a470: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
a480: 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d  o read entire T-
a490: 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e  buffer, returnin
a4a0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a4b0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
a4c0: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
a4d0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
a4e0: 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62  fer(slot, vval_b
a4f0: 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66  uf, vlen, 2, off
a500: 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61  set_v);..if (rea
a510: 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b  d_ret != vlen) {
a520: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a530: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
a540: 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d  o read entire V-
a550: 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e  buffer, returnin
a560: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a570: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
a580: 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61  ..}...tval = tva
a590: 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76  l_buf;..vval = v
a5a0: 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20  val_buf;..while 
a5b0: 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65  (tlen > 0 && vle
a5c0: 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d  n > 0) {...tag =
a5d0: 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b   *tval;...tval++
a5e0: 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69  ;...tlen--;....i
a5f0: 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66  f (*tval == 0xff
a600: 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20  ) {....length = 
a610: 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c  (tval[2] << 8) |
a620: 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61   tval[1];....tva
a630: 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20  l += 3;....tlen 
a640: 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  -= 3;...} else {
a650: 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76  ....length = *tv
a660: 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09  al;....tval++;..
a670: 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09  ..tlen--;...}...
a680: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a690: 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25  INTF("Tag: %s (%
a6a0: 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  02x)", CACKEY_DE
a6b0: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
a6c0: 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67  STR(tag), (unsig
a6d0: 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09  ned int) tag);..
a6e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a6f0: 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c  INTBUF("Value:",
a700: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
a710: 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
a720: 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20   NULL;...switch 
a730: 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20  (tag) {....case 
a740: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
a750: 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  L:.....curr_enti
a760: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
a770: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
a780: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
a790: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
a7a0: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  l = malloc(sizeo
a7b0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  f(*curr_entity->
a7c0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b  value_cardurl));
a7d0: 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72  ......memcpy(cur
a7e0: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
a7f0: 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76  cardurl->rid, vv
a800: 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72  al, 5);.....curr
a810: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
a820: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20  ardurl->apptype 
a830: 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63  = vval[5];.....c
a840: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
a850: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
a860: 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c  tid = (vval[6] <
a870: 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a  < 8) | vval[7];.
a880: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
a890: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
a8a0: 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d  appid = (vval[8]
a8b0: 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d   << 8) | vval[9]
a8c0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
a8d0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
a8e0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a8f0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
a900: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
a910: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
a920: 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f  TABLE:.....curr_
a930: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
a940: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
a950: 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75  ity));.....tmpbu
a960: 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74  f = malloc(lengt
a970: 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  h);......memcpy(
a980: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
a990: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72  ngth);......curr
a9a0: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
a9b0: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
a9c0: 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65  ity->length = le
a9d0: 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65  ngth;.....curr_e
a9e0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74  ntity->value = t
a9f0: 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f  mpbuf;.....curr_
aa00: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
aa10: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
aa20: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
aa30: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
aa40: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
aa50: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
aa60: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b  (*curr_entity));
aa70: 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
aa80: 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09 09  = length * 2;...
aa90: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
aaa0: 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 23  c(tmpbuflen);..#
aab0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
aac0: 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72  ....uncompress_r
aad0: 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28  et = uncompress(
aae0: 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c  tmpbuf, &tmpbufl
aaf0: 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  en, vval, length
ab00: 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d  );.....if (uncom
ab10: 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f  press_ret != Z_O
ab20: 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  K) {......CACKEY
ab30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
ab40: 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72  ailed to decompr
ab50: 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28  ess, uncompress(
ab60: 29 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d  ) returned %i --
ab70: 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69   resorting to di
ab80: 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f  rect copy", unco
ab90: 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09  mpress_ret);....
aba0: 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c  ...tmpbuflen = l
abb0: 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63  ength;......memc
abc0: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
abd0: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a   length);.....}.
abe0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
abf0: 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f  G_PRINTBUF("Deco
ac00: 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74  mpressed to:", t
ac10: 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
ac20: 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43  );.#else.....CAC
ac30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ac40: 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53  ("Missing ZLIB S
ac50: 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72  upport, this cer
ac60: 74 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65  tificate is like
ac70: 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b  ly useless...");
ac80: 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
ac90: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65  = length;.....me
aca0: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
acb0: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64  l, length);.#end
acc0: 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  if......curr_ent
acd0: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
ace0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
acf0: 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66  >length = tmpbuf
ad00: 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  len;.....curr_en
ad10: 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
ad20: 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
ad30: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
ad40: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
ad50: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
ad60: 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63  AG_PKCS15:.....c
ad70: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
ad80: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
ad90: 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09  _entity));......
ada0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
adb0: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
adc0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62  _entity->value_b
add0: 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09  yte = vval[0];..
ade0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
adf0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
ae00: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
ae10: 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b  .vval += length;
ae20: 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74  ...vlen -= lengt
ae30: 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65  h;....if (curr_e
ae40: 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b  ntity != NULL) {
ae50: 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20  ....if (root == 
ae60: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74  NULL) {.....root
ae70: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
ae80: 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73  ...}.....if (las
ae90: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  t != NULL) {....
aea0: 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63  .last->_next = c
aeb0: 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d  urr_entity;....}
aec0: 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72  .....last = curr
aed0: 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a  _entity;...}..}.
aee0: 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a  ..return(root);.
aef0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
af00: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
af10: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
af20: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
af30: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
af40: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
af50: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
af60: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
af70: 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
af80: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
af90: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73  pcsc_identity *s
afa0: 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75  tart, size_t cou
afb0: 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61  nt, int free_sta
afc0: 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64  rt) {..size_t id
afd0: 78 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  x;...for (idx = 
afe0: 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20  0; idx < count; 
aff0: 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73  idx++) {...if (s
b000: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
b010: 69 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65  icate) {....free
b020: 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74  (start[idx].cert
b030: 69 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d  ificate);...}..}
b040: 0a 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61 72  ...if (free_star
b050: 74 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72  t) {...free(star
b060: 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b  t);..}...return;
b070: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
b080: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
b090: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
b0a0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
b0b0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
b0c0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
b0d0: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
b0e0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  . */.static stru
b0f0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
b100: 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  dentity *cackey_
b110: 72 65 61 64 5f 63 65 72 74 73 28 73 74 72 75 63  read_certs(struc
b120: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
b130: 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  lot, struct cack
b140: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
b150: 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65   *certs, unsigne
b160: 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b  d long *count) {
b170: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
b180: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
b190: 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20  urr_id;..struct 
b1a0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
b1b0: 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63  y *ccc_tlv, *ccc
b1c0: 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c  _curr, *app_tlv,
b1d0: 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73   *app_curr;..uns
b1e0: 69 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61  igned char ccc_a
b1f0: 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49  id[] = {GSCIS_AI
b200: 44 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e 65  D_CCC};..unsigne
b210: 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b  d char curr_aid[
b220: 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  7];..unsigned lo
b230: 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09  ng outidx = 0;..
b240: 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73  cackey_ret trans
b250: 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 69 6e 74  action_ret;..int
b260: 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65   certs_resizable
b270: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c  ;..int send_ret,
b280: 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09 43   select_ret;...C
b290: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b2a0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
b2b0: 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55  .if (count == NU
b2c0: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
b2d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75  EBUG_PRINTF("cou
b2e0: 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75  nt is NULL, retu
b2f0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b300: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
b310: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65  LL);..}...if (ce
b320: 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts != NULL) {..
b330: 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30  .if (*count == 0
b340: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
b350: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
b360: 65 73 74 65 64 20 77 65 20 72 65 74 75 72 6e 20  ested we return 
b370: 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74  0 objects, short
b380: 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09  -circuit");.....
b390: 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09  return(certs);..
b3a0: 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  .}..}.../* Begin
b3b0: 20 61 20 53 6d 61 72 74 43 61 72 64 20 74 72 61   a SmartCard tra
b3c0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61  nsaction */..tra
b3d0: 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63  nsaction_ret = c
b3e0: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
b3f0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09  saction(slot);..
b400: 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f  if (transaction_
b410: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
b420: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
b430: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b440: 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74  ("Unable begin t
b450: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75  ransaction, retu
b460: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b470: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
b480: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65  LL);..}...if (ce
b490: 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts == NULL) {..
b4a0: 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28  .certs = malloc(
b4b0: 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
b4c0: 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20   5);...*count = 
b4d0: 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a  5;...certs_resiz
b4e0: 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73  able = 1;..} els
b4f0: 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69  e {...certs_resi
b500: 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  zable = 0;..}...
b510: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43 43  /* Select the CC
b520: 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e  C Applet */..sen
b530: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
b540: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
b550: 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65  t, ccc_aid, size
b560: 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69  of(ccc_aid));..i
b570: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
b580: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
b590: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
b5a0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
b5b0: 20 74 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41   to select CCC A
b5c0: 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67  pplet, returning
b5d0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
b5e0: 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53  ../* Terminate S
b5f0: 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63  martCard Transac
b600: 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79  tion */...cackey
b610: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
b620: 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72  (slot);....retur
b630: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
b640: 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70   Read all the ap
b650: 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43  plets from the C
b660: 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63 63  CC's TLV */..ccc
b670: 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65  _tlv = cackey_re
b680: 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09  ad_tlv(slot);...
b690: 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44  /* Look for CARD
b6a0: 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73  URLs that coores
b6b0: 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c  pond to PKI appl
b6c0: 65 74 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63 63  ets */..for (ccc
b6d0: 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b  _curr = ccc_tlv;
b6e0: 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63   ccc_curr; ccc_c
b6f0: 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e  urr = ccc_curr->
b700: 5f 6e 65 78 74 29 20 7b 0a 09 09 43 41 43 4b 45  _next) {...CACKE
b710: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b720: 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e  Found tag: %s ..
b730: 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  . ", CACKEY_DEBU
b740: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
b750: 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29  R(ccc_curr->tag)
b760: 29 3b 0a 0a 09 09 69 66 20 28 63 63 63 5f 63 75  );....if (ccc_cu
b770: 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
b780: 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a  _TAG_CARDURL) {.
b790: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b7a0: 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
b7b0: 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
b7c0: 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 41  ly care about CA
b7d0: 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 63  RDURLs)");.....c
b7e0: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
b7f0: 69 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76  if ((ccc_curr->v
b800: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
b810: 70 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54  ptype & CACKEY_T
b820: 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43  LV_APP_PKI) != C
b830: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
b840: 49 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  I) {....CACKEY_D
b850: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
b860: 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
b870: 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
b880: 75 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20  ut PKI applets, 
b890: 74 68 69 73 20 61 70 70 6c 65 74 20 73 75 70 70  this applet supp
b8a0: 6f 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c  orts: %s/%02x)",
b8b0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
b8c0: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
b8d0: 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  R(ccc_curr->valu
b8e0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
b8f0: 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  pe), (unsigned i
b900: 6e 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  nt) ccc_curr->va
b910: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
b920: 74 79 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74 69  type);.....conti
b930: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  nue;...}....CACK
b940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
b950: 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75  F("RID:", ccc_cu
b960: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b970: 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
b980: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
b990: 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
b9a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b9b0: 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73  INTF("AppID = %s
b9c0: 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f  /%04lx", CACKEY_
b9d0: 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
b9e0: 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
b9f0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
ba00: 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e  >appid), (unsign
ba10: 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
ba20: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
ba30: 2d 3e 61 70 70 69 64 29 3b 0a 09 09 43 41 43 4b  ->appid);...CACK
ba40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ba50: 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25  "ObjectID = %s/%
ba60: 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45  04lx", CACKEY_DE
ba70: 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
ba80: 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
ba90: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
baa0: 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67  bjectid), (unsig
bab0: 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75  ned long) ccc_cu
bac0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
bad0: 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09  l->objectid);...
bae0: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64  .memcpy(curr_aid
baf0: 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
bb00: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
bb10: 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
bb20: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
bb30: 72 69 64 29 29 3b 0a 09 09 63 75 72 72 5f 61 69  rid));...curr_ai
bb40: 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  d[sizeof(curr_ai
bb50: 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63  d) - 2] = (ccc_c
bb60: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
bb70: 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20  rl->appid >> 8) 
bb80: 26 20 30 78 66 66 3b 0a 09 09 63 75 72 72 5f 61  & 0xff;...curr_a
bb90: 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
bba0: 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63  id) - 1] = ccc_c
bbb0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
bbc0: 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66  rl->appid & 0xff
bbd0: 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20 66  ;..../* Select f
bbe0: 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20  ound applet ... 
bbf0: 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20  */...select_ret 
bc00: 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  = cackey_select_
bc10: 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72  applet(slot, cur
bc20: 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75  r_aid, sizeof(cu
bc30: 72 72 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28  rr_aid));...if (
bc40: 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41  select_ret != CA
bc50: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
bc60: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
bc70: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
bc80: 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65   to select apple
bc90: 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63  t, skipping proc
bca0: 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  essing of this o
bcb0: 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e  bject");.....con
bcc0: 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  tinue;...}..../*
bcd0: 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20   ... and object 
bce0: 28 66 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c 65  (file) */...sele
bcf0: 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
bd00: 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74  select_file(slot
bd10: 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
bd20: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
bd30: 74 69 64 29 3b 0a 09 09 69 66 20 28 73 65 6c 65  tid);...if (sele
bd40: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
bd50: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
bd60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bd70: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
bd80: 73 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69  select file, ski
bd90: 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67  pping processing
bda0: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22   of this object"
bdb0: 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
bdc0: 0a 09 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63 65  ...}..../* Proce
bdd0: 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20 54  ss this file's T
bde0: 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63  LV looking for c
bdf0: 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
be00: 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65  .app_tlv = cacke
be10: 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29  y_read_tlv(slot)
be20: 3b 0a 0a 09 09 66 6f 72 20 28 61 70 70 5f 63 75  ;....for (app_cu
be30: 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70  rr = app_tlv; ap
be40: 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72  p_curr; app_curr
be50: 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65   = app_curr->_ne
be60: 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  xt) {....CACKEY_
be70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
be80: 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41  und tag: %s", CA
be90: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
bea0: 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63  TAG_TO_STR(app_c
beb0: 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 69  urr->tag));....i
bec0: 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67  f (app_curr->tag
bed0: 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45   != GSCIS_TAG_CE
bee0: 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
bef0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bf00: 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
bf10: 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
bf20: 20 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54   care about CERT
bf30: 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09  IFICATEs)");....
bf40: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
bf50: 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26  .....curr_id = &
bf60: 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09  certs[outidx];..
bf70: 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09  ..outidx++;.....
bf80: 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e  memcpy(curr_id->
bf90: 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64  applet, curr_aid
bfa0: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  , sizeof(curr_id
bfb0: 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 63  ->applet));....c
bfc0: 75 72 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20 63  urr_id->file = c
bfd0: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
bfe0: 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64  ardurl->objectid
bff0: 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65  ;....curr_id->ke
c000: 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09  ysize = -1;.....
c010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c020: 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72  NTF("Filling cur
c030: 72 5f 69 64 2d 3e 61 70 70 6c 65 74 20 28 25 70  r_id->applet (%p
c040: 29 20 77 69 74 68 20 25 6c 75 20 62 79 74 65 73  ) with %lu bytes
c050: 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70 70  :", curr_id->app
c060: 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  let, (unsigned l
c070: 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 75 72 72  ong) sizeof(curr
c080: 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09  _id->applet));..
c090: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c0a0: 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c 20  RINTBUF("VAL:", 
c0b0: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c  curr_id->applet,
c0c0: 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d   sizeof(curr_id-
c0d0: 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 63  >applet));.....c
c0e0: 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
c0f0: 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75  ate_len = app_cu
c100: 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09  rr->length;.....
c110: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
c120: 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  cate = malloc(cu
c130: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
c140: 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63  te_len);....memc
c150: 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  py(curr_id->cert
c160: 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72  ificate, app_cur
c170: 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69  r->value, curr_i
c180: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
c190: 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74  en);.....if (out
c1a0: 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
c1b0: 0a 09 09 09 09 69 66 20 28 63 65 72 74 73 5f 72  .....if (certs_r
c1c0: 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09  esizable) {.....
c1d0: 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09  .*count *= 2;...
c1e0: 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
c1f0: 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
c200: 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
c210: 6e 74 29 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  nt));.....} else
c220: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
c230: 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  ...}....}...}...
c240: 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
c250: 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 69 66  (app_tlv);....if
c260: 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75   (outidx >= *cou
c270: 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a  nt) {....break;.
c280: 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  ..}..}...cackey_
c290: 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76  free_tlv(ccc_tlv
c2a0: 29 3b 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75  );...*count = ou
c2b0: 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74  tidx;...if (cert
c2c0: 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09  s_resizable) {..
c2d0: 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63  .certs = realloc
c2e0: 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a  (certs, sizeof(*
c2f0: 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74  certs) * (*count
c300: 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 65 72 6d  ));..}.../* Term
c310: 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20  inate SmartCard 
c320: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
c330: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
c340: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
c350: 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d  return(certs);.}
c360: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
c370: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
c380: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
c390: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
c3a0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
c3b0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
c3c0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
c3d0: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
c3e0: 74 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  t cackey_signdec
c3f0: 72 79 70 74 28 73 74 72 75 63 74 20 63 61 63 6b  rypt(struct cack
c400: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73  ey_slot *slot, s
c410: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
c420: 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
c430: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c440: 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c  buf, size_t bufl
c450: 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  en, unsigned cha
c460: 72 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f  r *outbuf, size_
c470: 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74  t outbuflen, int
c480: 20 70 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75   padInput, int u
c490: 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 75  npadOutput) {..u
c4a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d  nsigned char *tm
c4b0: 70 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c  pbuf, *tmpbuf_s,
c4c0: 20 2a 6f 75 74 62 75 66 5f 73 3b 0a 09 75 6e 73   *outbuf_s;..uns
c4d0: 69 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73  igned char bytes
c4e0: 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a 09 75  _to_send, p1;..u
c4f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f  nsigned char blo
c500: 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  cktype;..cackey_
c510: 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75  ret send_ret;..u
c520: 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65  int16_t respcode
c530: 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61  ;..ssize_t retva
c540: 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73  l = 0, unpadoffs
c550: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62  et;..size_t tmpb
c560: 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74  uflen, padlen, t
c570: 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 6e  mpoutbuflen;..in
c580: 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  t free_tmpbuf = 
c590: 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41  0;..int le;...CA
c5a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c5b0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
c5c0: 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c  if (slot == NULL
c5d0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c5e0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
c5f0: 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22  .  slot is NULL"
c600: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c610: 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d  ;..}...if (buf =
c620: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
c630: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c640: 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20  "Error.  buf is 
c650: 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
c660: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
c670: 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  outbuf == NULL) 
c680: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c690: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
c6a0: 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22   outbuf is NULL"
c6b0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c6c0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74  ;..}...if (ident
c6d0: 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
c6e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c6f0: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
c700: 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29  entity is NULL")
c710: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
c720: 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  ..}...if (identi
c730: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
c740: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
c750: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c760: 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
c770: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
c780: 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  ity is NULL");..
c790: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
c7a0: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
c7b0: 69 64 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a  identity Key siz
c7c0: 65 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  e */..if (identi
c7d0: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
c7e0: 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20  y->keysize < 0) 
c7f0: 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63  {...identity->pc
c800: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
c810: 73 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b  size = x509_to_k
c820: 65 79 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d  eysize(identity-
c830: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
c840: 63 65 72 74 69 66 69 63 61 74 65 2c 20 69 64 65  certificate, ide
c850: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
c860: 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
c870: 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  e_len);..}.../* 
c880: 50 61 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b  Pad message to k
c890: 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28  ey size */..if (
c8a0: 70 61 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66  padInput) {...if
c8b0: 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
c8c0: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
c8d0: 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20  ze > 0) {....if 
c8e0: 28 62 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74  (buflen != ident
c8f0: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
c900: 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09  ty->keysize) {..
c910: 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20  ...if (buflen > 
c920: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
c930: 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
c940: 65 20 2b 20 33 29 29 20 7b 0a 09 09 09 09 09 43  e + 3)) {......C
c950: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c960: 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73  TF("Error.  Mess
c970: 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
c980: 20 74 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74   to sign/decrypt
c990: 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e  ");.......return
c9a0: 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  (-1);.....}.....
c9b0: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65  .tmpbuflen = ide
c9c0: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
c9d0: 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09  tity->keysize;..
c9e0: 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
c9f0: 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09  oc(tmpbuflen);..
ca00: 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
ca10: 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20   1;......padlen 
ca20: 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75  = tmpbuflen - bu
ca30: 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 2f  flen - 3;....../
ca40: 2a 20 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53  * RSA PKCS#1 EMS
ca50: 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64  A-PKCS1-v1_5 Pad
ca60: 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62  ding */.....tmpb
ca70: 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09  uf[0] = 0x00;...
ca80: 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78  ..tmpbuf[1] = 0x
ca90: 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26  01;.....memset(&
caa0: 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c  tmpbuf[2], 0xFF,
cab0: 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d   padlen);.....tm
cac0: 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d  pbuf[padlen + 2]
cad0: 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63  = 0x00;.....memc
cae0: 70 79 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65  py(&tmpbuf[padle
caf0: 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66  n + 3], buf, buf
cb00: 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  len);......CACKE
cb10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
cb20: 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75  ("Unpadded:", bu
cb30: 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  f, buflen);.....
cb40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
cb50: 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c  NTBUF("Padded:",
cb60: 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
cb70: 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  en);....} else {
cb80: 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75  .....tmpbuf = bu
cb90: 66 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  f;.....tmpbuflen
cba0: 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66   = buflen;.....f
cbb0: 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a  ree_tmpbuf = 0;.
cbc0: 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ....padlen = 0;.
cbd0: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
cbe0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cbf0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
cc00: 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20  o determine key 
cc10: 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65  size, hoping the
cc20: 20 6d 65 73 73 61 67 65 20 69 73 20 70 72 6f 70   message is prop
cc30: 65 72 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a  erly padded!");.
cc40: 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  ....tmpbuf = buf
cc50: 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  ;....tmpbuflen =
cc60: 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65   buflen;....free
cc70: 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09  _tmpbuf = 0;....
cc80: 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a  padlen = 0;...}.
cc90: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62  .} else {...tmpb
cca0: 75 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62  uf = buf;...tmpb
ccb0: 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
ccc0: 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  ..free_tmpbuf = 
ccd0: 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b  0;...padlen = 0;
cce0: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74  ..}.../* Begin t
ccf0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
cd00: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
cd10: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
cd20: 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65  ./* Select corre
cd30: 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 43 41  ct applet */..CA
cd40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cd50: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70  F("Selecting app
cd60: 6c 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20  let found at %p 
cd70: 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e  ...", identity->
cd80: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61  pcsc_identity->a
cd90: 70 70 6c 65 74 29 3b 0a 09 63 61 63 6b 65 79 5f  pplet);..cackey_
cda0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
cdb0: 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
cdc0: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70  sc_identity->app
cdd0: 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e  let, sizeof(iden
cde0: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
cdf0: 69 74 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a  ity->applet));..
ce00: 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65  ./* Select corre
ce10: 63 74 20 66 69 6c 65 20 2a 2f 0a 09 63 61 63 6b  ct file */..cack
ce20: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
ce30: 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  lot, identity->p
ce40: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69  csc_identity->fi
ce50: 6c 65 29 3b 0a 0a 09 74 6d 70 62 75 66 5f 73 20  le);...tmpbuf_s 
ce60: 3d 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75  = tmpbuf;..outbu
ce70: 66 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77  f_s = outbuf;..w
ce80: 68 69 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29  hile (tmpbuflen)
ce90: 20 7b 0a 09 09 69 66 20 28 74 6d 70 62 75 66 6c   {...if (tmpbufl
cea0: 65 6e 20 3e 20 32 34 35 29 20 7b 0a 09 09 09 62  en > 245) {....b
ceb0: 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 32  ytes_to_send = 2
cec0: 34 35 3b 0a 09 09 09 70 31 20 3d 20 30 78 38 30  45;....p1 = 0x80
ced0: 3b 0a 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  ;....le = 0x00;.
cee0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79  ..} else {....by
cef0: 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d  tes_to_send = tm
cf00: 70 62 75 66 6c 65 6e 3b 0a 09 09 09 70 31 20 3d  pbuflen;....p1 =
cf10: 20 30 78 30 30 3b 0a 09 09 09 6c 65 20 3d 20 30   0x00;....le = 0
cf20: 78 30 30 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 6f  x00;...}....tmpo
cf30: 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75  utbuflen = outbu
cf40: 66 6c 65 6e 3b 0a 0a 09 09 73 65 6e 64 5f 72 65  flen;....send_re
cf50: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
cf60: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
cf70: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
cf80: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
cf90: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c  STR_SIGNDECRYPT,
cfa0: 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73   p1, 0x00, bytes
cfb0: 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66  _to_send, tmpbuf
cfc0: 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c  , le, &respcode,
cfd0: 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74   outbuf, &tmpout
cfe0: 62 75 66 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73  buflen);...if (s
cff0: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
d000: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
d010: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d020: 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
d030: 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65  ing Failed -- re
d040: 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
d050: 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65  .");.....if (fre
d060: 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09  e_tmpbuf) {.....
d070: 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
d080: 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  .....free(tmpbuf
d090: 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  _s);.....}....}.
d0a0: 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ..../* End trans
d0b0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  action */....cac
d0c0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
d0d0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69  ion(slot);.....i
d0e0: 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
d0f0: 78 36 39 38 32 29 20 7b 0a 09 09 09 09 43 41 43  x6982) {.....CAC
d100: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d110: 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74 75  ("Security statu
d120: 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64  s not satisified
d130: 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45  .  Returning NEE
d140: 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09 73  DLOGIN");......s
d150: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20  lot->slot_reset 
d160: 3d 20 31 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74  = 1;.....slot->t
d170: 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
d180: 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
d190: 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
d1a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
d1b0: 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  OGIN);....}.....
d1c0: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
d1d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
d1e0: 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09  KENABSENT) {....
d1f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d200: 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62 73 65  INTF("Token abse
d210: 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 54  nt.  Returning T
d220: 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a 09  OKENABSENT");...
d230: 09 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65  ...slot->slot_re
d240: 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c 6f  set = 1;.....slo
d250: 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
d260: 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
d270: 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  RED;......return
d280: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
d290: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
d2a0: 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  }.....return(-1)
d2b0: 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20  ;...}....tmpbuf 
d2c0: 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  += bytes_to_send
d2d0: 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d  ;...tmpbuflen -=
d2e0: 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a   bytes_to_send;.
d2f0: 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70  ...outbuf += tmp
d300: 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74  outbuflen;...out
d310: 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74  buflen -= tmpout
d320: 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c  buflen;...retval
d330: 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e   += tmpoutbuflen
d340: 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f  ;..}...if (free_
d350: 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28  tmpbuf) {...if (
d360: 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66  tmpbuf_s) {....f
d370: 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09  ree(tmpbuf_s);..
d380: 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d  .}..}...outbuf =
d390: 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20   outbuf_s;.../* 
d3a0: 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  End transaction 
d3b0: 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
d3c0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
d3d0: 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  ;..#ifdef CACKEY
d3e0: 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
d3f0: 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
d400: 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c  MAX..if (outbufl
d410: 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  en > _POSIX_SSIZ
d420: 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
d430: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d440: 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64  Outbuflen exceed
d450: 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c  s maximum value,
d460: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d470: 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c  ilure. (max = %l
d480: 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25  i, outbuflen = %
d490: 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
d4a0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
d4b0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
d4c0: 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65  utbuflen);....re
d4d0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
d4e0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f  endif.#endif.../
d4f0: 2a 20 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f  * Unpad reply */
d500: 0a 09 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75  ..if (unpadOutpu
d510: 74 29 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61  t) {...if (retva
d520: 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b  l < 3) {....CACK
d530: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d540: 22 52 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d  "Reply is too sm
d550: 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20  all, we are not 
d560: 61 62 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d  able to unpad --
d570: 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e   passing back an
d580: 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65  d hoping for the
d590: 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41   best!");.....CA
d5a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d5b0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
d5c0: 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20  success, retval 
d5d0: 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20  = %li (bytes)", 
d5e0: 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a  (long) retval);.
d5f0: 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
d600: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75  );...}....if (ou
d610: 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29  tbuf[0] != 0x00)
d620: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
d630: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63  UG_PRINTF("Unrec
d640: 6f 67 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20  ognized padding 
d650: 73 63 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e  scheme -- passin
d660: 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e  g back and hopin
d670: 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22  g for the best!"
d680: 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
d690: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
d6a0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
d6b0: 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28  , retval = %li (
d6c0: 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20  bytes)", (long) 
d6d0: 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75  retval);....retu
d6e0: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a  rn(retval);...}.
d6f0: 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f  ...blocktype = o
d700: 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61  utbuf[1];...unpa
d710: 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09  doffset = 0;....
d720: 73 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70  switch (blocktyp
d730: 65 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30  e) {....case 0x0
d740: 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e  0:...../* Paddin
d750: 67 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20  g Scheme 1, the 
d760: 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62  first non-zero b
d770: 79 74 65 20 69 73 20 74 68 65 20 73 74 61 72 74  yte is the start
d780: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09   of data */.....
d790: 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74  for (unpadoffset
d7a0: 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65   = 2; unpadoffse
d7b0: 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61  t < retval; unpa
d7c0: 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09  doffset++) {....
d7d0: 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
d7e0: 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30  adoffset] != 0x0
d7f0: 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  0) {.......break
d800: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
d810: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
d820: 65 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50  e 0x01:...../* P
d830: 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c  adding Scheme 2,
d840: 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20 30   pad bytes are 0
d850: 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  xFF followed by 
d860: 30 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20  0x00 */.....for 
d870: 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32  (unpadoffset = 2
d880: 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20  ; unpadoffset < 
d890: 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66  retval; unpadoff
d8a0: 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  set++) {......if
d8b0: 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
d8c0: 66 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b  fset] != 0xFF) {
d8d0: 0a 09 09 09 09 09 09 69 66 20 28 6f 75 74 62 75  .......if (outbu
d8e0: 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d  f[unpadoffset] =
d8f0: 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09  = 0x00) {.......
d900: 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a  .unpadoffset++;.
d910: 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
d920: 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
d930: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
d940: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
d950: 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66  d padding data f
d960: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  ound, returning 
d970: 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75  in failure, shou
d980: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 30  ld have been 0x0
d990: 30 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c  0 found 0x%02x",
d9a0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
d9b0: 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
d9c0: 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65  et]);.........re
d9d0: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09  turn(-1);.......
d9e0: 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  }......} else {.
d9f0: 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
da00: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
da10: 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20  id padding data 
da20: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67  found, returning
da30: 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f   in failure, sho
da40: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78  uld have been 0x
da50: 46 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22  FF found 0x%02x"
da60: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
da70: 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66   outbuf[unpadoff
da80: 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65  set]);........re
da90: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d  turn(-1);......}
daa0: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
dab0: 3b 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a  ;....case 0x02:.
dac0: 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53  ..../* Padding S
dad0: 63 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74  cheme 3, pad byt
dae0: 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20  es are non-zero 
daf0: 66 69 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20  first zero byte 
db00: 66 6f 75 6e 64 20 69 73 20 74 68 65 20 73 65 70  found is the sep
db10: 65 72 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09  erator byte */..
db20: 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66  ...for (unpadoff
db30: 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66  set = 2; unpadof
db40: 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75  fset < retval; u
db50: 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a  npadoffset++) {.
db60: 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
db70: 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20  unpadoffset] == 
db80: 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e  0x00) {.......un
db90: 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09  padoffset++;....
dba0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
dbb0: 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  }.....}.....brea
dbc0: 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e  k;...}....if (un
dbd0: 70 61 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76  padoffset > retv
dbe0: 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  al) {....CACKEY_
dbf0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66  DEBUG_PRINTF("Of
dc00: 66 73 65 74 20 67 72 65 61 74 65 72 20 74 68 61  fset greater tha
dc10: 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62  n reply size, ab
dc20: 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f  orting.  (unpado
dc30: 66 66 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74  ffset = %lu, ret
dc40: 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e  val = %lu)", (un
dc50: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70  signed long) unp
dc60: 61 64 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67  adoffset, (unsig
dc70: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c  ned long) retval
dc80: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
dc90: 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
dca0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
dcb0: 22 50 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75  "Padded:", outbu
dcc0: 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  f, retval);....r
dcd0: 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66  etval -= unpadof
dce0: 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28  fset;...memmove(
dcf0: 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b  outbuf, outbuf +
dd00: 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65   unpadoffset, re
dd10: 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59  tval);....CACKEY
dd20: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
dd30: 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74  "Unpadded:", out
dd40: 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d  buf, retval);..}
dd50: 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
dd60: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
dd70: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
dd80: 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74  etval = %li (byt
dd90: 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74  es)", (long) ret
dda0: 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
ddb0: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  etval);.}../*. *
ddc0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
ddd0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
dde0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
ddf0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
de00: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
de10: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
de20: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
de30: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
de40: 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63  ckey_login(struc
de50: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
de60: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
de70: 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65  ar *pin, unsigne
de80: 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20  d long pin_len, 
de90: 69 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69  int *tries_remai
dea0: 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69 67  ning_p) {..unsig
deb0: 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e  ned char cac_pin
dec0: 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46  [8] = {0xFF, 0xF
ded0: 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
dee0: 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
def0: 20 30 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36 5f   0xFF};..uint16_
df00: 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b  t response_code;
df10: 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61  ..int tries_rema
df20: 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64  ining;..int send
df30: 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63  _ret;.../* Indic
df40: 61 74 65 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ate that we do n
df50: 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f  ot know about ho
df60: 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72 65  w many tries are
df70: 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69   remaining */..i
df80: 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  f (tries_remaini
df90: 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 73  ng_p) {...*tries
dfa0: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d  _remaining_p = -
dfb0: 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72  1;..}.../* Appar
dfc0: 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20  ently, CAC PINs 
dfd0: 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20  are *EXACTLY* 8 
dfe0: 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61  bytes long -- pa
dff0: 64 20 77 69 74 68 20 30 78 46 46 20 69 66 20 74  d with 0xFF if t
e000: 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20  oo short */..if 
e010: 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b  (pin_len >= 8) {
e020: 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69  ...memcpy(cac_pi
e030: 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65  n, pin, 8);..} e
e040: 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63  lse {...memcpy(c
e050: 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e  ac_pin, pin, pin
e060: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49  _len);..}.../* I
e070: 73 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20  ssue PIN Verify 
e080: 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  */..send_ret = c
e090: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
e0a0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
e0b0: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
e0c0: 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30  _INSTR_VERIFY, 0
e0d0: 78 30 30 2c 20 30 78 30 30 2c 20 73 69 7a 65 6f  x00, 0x00, sizeo
e0e0: 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f  f(cac_pin), cac_
e0f0: 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70  pin, 0x00, &resp
e100: 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c  onse_code, NULL,
e110: 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e   NULL);..if (sen
e120: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
e130: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
e140: 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  f ((response_cod
e150: 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30  e & 0x63C0) == 0
e160: 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65  x63C0) {....trie
e170: 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72  s_remaining = (r
e180: 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
e190: 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  xF);.....CACKEY_
e1a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
e1b0: 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
e1c0: 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20  ailed, %i tries 
e1d0: 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65  remaining", trie
e1e0: 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09  s_remaining);...
e1f0: 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61  ..if (tries_rema
e200: 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a  ining_p) {.....*
e210: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
e220: 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  p = tries_remain
e230: 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  ing;....}.....re
e240: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
e250: 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a  _E_BADPIN);...}.
e260: 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f  ...if (response_
e270: 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20  code == 0x6983) 
e280: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
e290: 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
e2a0: 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65  rification faile
e2b0: 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63  d, device is loc
e2c0: 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ked");.....retur
e2d0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
e2e0: 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09  LOCKED);...}....
e2f0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
e300: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
e310: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
e320: 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
e330: 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65  ification succee
e340: 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ded");...return(
e350: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
e360: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
e370: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
e380: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
e390: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
e3a0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
e3b0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
e3c0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
e3d0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
e3e0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
e3f0: 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74  token_present(st
e400: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e410: 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65   *slot) {..cacke
e420: 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65  y_ret pcsc_conne
e430: 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72  ct_ret;..DWORD r
e440: 65 61 64 65 72 5f 6c 65 6e 2c 20 73 74 61 74 65  eader_len, state
e450: 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 5f  , protocol, atr_
e460: 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d  len;..BYTE atr[M
e470: 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c  AX_ATR_SIZE];..L
e480: 4f 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20  ONG status_ret, 
e490: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
e4a0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e4b0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
e4c0: 22 29 3b 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  ");...pcsc_conne
e4d0: 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
e4e0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
e4f0: 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  t);..if (pcsc_co
e500: 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
e510: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
e520: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e530: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
e540: 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
e550: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  d, returning tok
e560: 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
e570: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
e580: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
e590: 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65 6e 20  );..}...atr_len 
e5a0: 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09  = sizeof(atr);..
e5b0: 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
e5c0: 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
e5d0: 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20  csc_card, NULL, 
e5e0: 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
e5f0: 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
e600: 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
e610: 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
e620: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
e630: 53 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 73 6c  SS) {...slot->sl
e640: 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09  ot_reset = 1;...
e650: 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67  slot->token_flag
e660: 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
e670: 51 55 49 52 45 44 3b 0a 0a 09 09 69 66 20 28 73  QUIRED;....if (s
e680: 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41  tatus_ret == SCA
e690: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29  RD_W_RESET_CARD)
e6a0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
e6b0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
e6c0: 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73   required, pleas
e6d0: 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09  e hold...");....
e6e0: 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  .scard_reconn_re
e6f0: 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t = SCardReconne
e700: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
e710: 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  rd, SCARD_SHARE_
e720: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
e730: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44  OTOCOL_T0, SCARD
e740: 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 70 72  _RESET_CARD, &pr
e750: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28  otocol);....if (
e760: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
e770: 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
e780: 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52 65  ESS) {...../* Re
e790: 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73  -establish trans
e7a0: 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61  action, if it wa
e7b0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09  s present */....
e7c0: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
e7d0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
e7e0: 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74  ) {......slot->t
e7f0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
e800: 2d 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f  --;......cackey_
e810: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
e820: 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a  n(slot);.....}..
e830: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
e840: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73  _PRINTF("Reset s
e850: 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65  uccessful, reque
e860: 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61  rying");.....sta
e870: 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53  tus_ret = SCardS
e880: 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63  tatus(slot->pcsc
e890: 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65  _card, NULL, &re
e8a0: 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65  ader_len, &state
e8b0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  , &protocol, atr
e8c0: 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09  , &atr_len);....
e8d0: 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
e8e0: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
e8f0: 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  SS) {......CACKE
e900: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e910: 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20  Still unable to 
e920: 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75  query card statu
e930: 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  s, returning tok
e940: 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
e950: 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c  dStatus() = %s",
e960: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
e970: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
e980: 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b  TR(status_ret));
e990: 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41  .......return(CA
e9a0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
e9b0: 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a  NABSENT);.....}.
e9c0: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
e9d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e9e0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72  NTF("Unable to r
e9f0: 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64  econnect to card
ea00: 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
ea10: 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
ea20: 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73  Reconnect() = %s
ea30: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
ea40: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
ea50: 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e  _STR(scard_recon
ea60: 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65  n_ret));......re
ea70: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
ea80: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
ea90: 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
eaa0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
eab0: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
eac0: 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74  to query card st
ead0: 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20  atus, returning 
eae0: 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
eaf0: 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25  CardStatus() = %
eb00: 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
eb10: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
eb20: 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74  O_STR(status_ret
eb30: 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ));.....return(C
eb40: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
eb50: 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09  ENABSENT);...}..
eb60: 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26  }...if ((state &
eb70: 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d   SCARD_ABSENT) =
eb80: 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20  = SCARD_ABSENT) 
eb90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
eba0: 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73  _PRINTF("Card is
ebb0: 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69   absent, returni
ebc0: 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22  ng token absent"
ebd0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
ebe0: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
ebf0: 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41  ABSENT);..}...CA
ec00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ec10: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b  F("Returning tok
ec20: 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a  en present.");..
ec30: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
ec40: 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
ec50: 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  NT);.}../*. * SY
ec60: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
ec70: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
ec80: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
ec90: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
eca0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ecb0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
ecc0: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
ecd0: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70  ssize_t cackey_p
ece0: 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f  csc_identity_to_
ecf0: 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63 61 63  label(struct cac
ed00: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
ed10: 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
ed20: 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65  igned char *labe
ed30: 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20  l_buf, unsigned 
ed40: 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  long label_buf_l
ed50: 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
ed60: 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  long certificate
ed70: 5f 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 6c 61 62  _len;..char *lab
ed80: 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a  el_asn1;..void *
ed90: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e  certificate;..in
eda0: 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  t x509_read_ret;
edb0: 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
edc0: 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
edd0: 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
ede0: 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
edf0: 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
ee00: 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
ee10: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29  ificate_len < 0)
ee20: 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b   {...return(-1);
ee30: 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f  ..}...x509_read_
ee40: 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75  ret = x509_to_su
ee50: 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74  bject(certificat
ee60: 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
ee70: 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c  en, (void **) &l
ee80: 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20  abel_asn1);..if 
ee90: 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
eea0: 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d   0) {...return(-
eeb0: 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65  1);..}...x509_re
eec0: 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e  ad_ret = x509_dn
eed0: 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c  _to_string(label
eee0: 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64  _asn1, x509_read
eef0: 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c  _ret, (char *) l
ef00: 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f  abel_buf, label_
ef10: 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a  buf_len, "CN");.
ef20: 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
ef30: 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30  et <= 0) {...x50
ef40: 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
ef50: 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
ef60: 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
ef70: 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
ef80: 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
ef90: 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c  bel_buf_len, NUL
efa0: 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f  L);....if (x509_
efb0: 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
efc0: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
efd0: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  ..}..}..#ifdef C
efe0: 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
eff0: 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
f000: 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35  SIZE_MAX..if (x5
f010: 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50  09_read_ret > _P
f020: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20  OSIX_SSIZE_MAX) 
f030: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
f040: 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65  _PRINTF("x509_re
f050: 61 64 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d  ad_ret exceeds m
f060: 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
f070: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
f080: 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
f090: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
f0a0: 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
f0b0: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
f0c0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f0d0: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a  x509_read_ret);.
f0e0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
f0f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
f100: 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f  f...return(x509_
f110: 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a  read_ret);.}../*
f120: 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
f130: 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
f140: 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
f150: 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d  _create(void **m
f160: 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
f170: 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
f180: 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
f190: 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
f1a0: 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
f1b0: 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
f1c0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
f1d0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
f1e0: 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
f1f0: 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
f200: 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
f210: 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
f220: 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61  hread_mutex = ma
f230: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68  lloc(sizeof(*pth
f240: 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09  read_mutex));...
f250: 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74  if (!pthread_mut
f260: 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ex) {....CACKEY_
f270: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
f280: 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  iled to allocate
f290: 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09   memory.");.....
f2a0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
f2b0: 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
f2c0: 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
f2d0: 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d  x_init(pthread_m
f2e0: 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69  utex, NULL);...i
f2f0: 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
f300: 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
f310: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f320: 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
f330: 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20  init() returned 
f340: 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
f350: 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
f360: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
f370: 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70  .}....*mutex = p
f380: 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d  thread_mutex;..}
f390: 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
f3a0: 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
f3b0: 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
f3c0: 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
f3d0: 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
f3e0: 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
f3f0: 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
f400: 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
f410: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f420: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
f430: 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28  rgs.CreateMutex(
f440: 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
f450: 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
f460: 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
f470: 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
f480: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
f490: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f4a0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
f4b0: 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
f4c0: 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
f4d0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
f4e0: 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
f4f0: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
f500: 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a  utex_lock(void *
f510: 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
f520: 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
f530: 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
f540: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
f550: 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
f560: 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
f570: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
f580: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
f590: 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
f5a0: 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
f5b0: 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
f5c0: 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
f5d0: 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
f5e0: 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64  utex;....pthread
f5f0: 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
f600: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68  d_mutex_lock(pth
f610: 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69  read_mutex);...i
f620: 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
f630: 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
f640: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f650: 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
f660: 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
f670: 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
f680: 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
f690: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
f6a0: 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
f6b0: 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  f (cackey_args.L
f6c0: 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ockMutex) {....c
f6d0: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
f6e0: 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
f6f0: 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
f700: 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
f710: 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
f720: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f730: 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
f740: 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29  args.LockMutex()
f750: 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
f760: 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
f770: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
f780: 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
f790: 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
f7a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f7b0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
f7c0: 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
f7d0: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
f7e0: 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
f7f0: 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
f800: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
f810: 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20  tex_unlock(void 
f820: 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
f830: 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
f840: 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
f850: 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
f860: 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
f870: 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
f880: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
f890: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
f8a0: 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
f8b0: 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
f8c0: 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
f8d0: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
f8e0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
f8f0: 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61  mutex;....pthrea
f900: 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
f910: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
f920: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a  pthread_mutex);.
f930: 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65  ..if (pthread_re
f940: 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
f950: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f960: 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74  NTF("pthread_mut
f970: 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75  ex_unlock() retu
f980: 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e  rned error (%i).
f990: 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  ", pthread_retva
f9a0: 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
f9b0: 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
f9c0: 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
f9d0: 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29  rgs.UnlockMutex)
f9e0: 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
f9f0: 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
fa00: 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75  s.UnlockMutex(mu
fa10: 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
fa20: 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
fa30: 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
fa40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fa50: 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e  ("cackey_args.Un
fa60: 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  lockMutex() retu
fa70: 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
fa80: 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
fa90: 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
faa0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
fab0: 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
fac0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
fad0: 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
fae0: 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
faf0: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
fb00: 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ic CK_ATTRIBUTE_
fb10: 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  PTR cackey_get_a
fb20: 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a  ttributes(CK_OBJ
fb30: 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74  ECT_CLASS object
fb40: 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63 61  class, struct ca
fb50: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
fb60: 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e  ty *identity, un
fb70: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
fb80: 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f  tity_num, CK_ULO
fb90: 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29  NG_PTR pulCount)
fba0: 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42   {..static CK_BB
fbb0: 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b  OOL ck_true = 1;
fbc0: 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f  ..static CK_BBOO
fbd0: 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a  L ck_false = 0;.
fbe0: 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74  .CK_ULONG numatt
fbf0: 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63  rs = 0, retval_c
fc00: 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42  ount;..CK_ATTRIB
fc10: 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74  UTE_TYPE curr_at
fc20: 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54  tr_type;..CK_ATT
fc30: 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72  RIBUTE curr_attr
fc40: 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56  , *retval;..CK_V
fc50: 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a  OID_PTR pValue;.
fc60: 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75  .CK_ULONG ulValu
fc70: 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54  eLen;..CK_OBJECT
fc80: 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74  _CLASS ck_object
fc90: 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54  _class;..CK_CERT
fca0: 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f  IFICATE_TYPE ck_
fcb0: 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
fcc0: 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63  ;..CK_KEY_TYPE c
fcd0: 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f  k_key_type;..CK_
fce0: 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75  UTF8CHAR ucTmpBu
fcf0: 66 5b 31 30 32 34 5d 3b 0a 09 75 6e 73 69 67 6e  f[1024];..unsign
fd00: 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69  ed char *certifi
fd10: 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63  cate;..ssize_t c
fd20: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
fd30: 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72   -1, x509_read_r
fd40: 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f  et;..int pValue_
fd50: 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  free;...CACKEY_D
fd60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
fd70: 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73  led (objectClass
fd80: 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79   = %lu, identity
fd90: 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28  _num = %lu).", (
fda0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
fdb0: 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e  bjectclass, iden
fdc0: 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 69 66 20  tity_num);...if 
fdd0: 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
fde0: 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
fdf0: 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
fe00: 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
fe10: 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
fe20: 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
fe30: 45 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  EY) {...CACKEY_D
fe40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
fe50: 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
fe60: 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
fe70: 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b   object class");
fe80: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
fe90: 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65  ;..}.../* Get Ce
fea0: 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74  rt */..if (ident
feb0: 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
fec0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
fed0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
fee0: 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
fef0: 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69  , invalid identi
ff00: 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09  y provided");...
ff10: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
ff20: 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20  }...certificate 
ff30: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
ff40: 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66  ificate;..certif
ff50: 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e  icate_len = iden
ff60: 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
ff70: 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72  e_len;...if (cer
ff80: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20  tificate_len == 
ff90: 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74  -1 || certificat
ffa0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
ffb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ffc0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
ffd0: 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
ffe0: 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f  this identity do
fff0: 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58  es not have an X
10000 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
10010 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10020 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74   it and will not
10030 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75   work");....retu
10040 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
10050 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65  * Verify that ce
10060 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e  rtificate is ASN
10070 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39  .1 encoded X.509
10080 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
10090 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72  .if (x509_to_ser
100a0 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
100b0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
100c0 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09  , NULL) < 0) {..
100d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
100e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
100f0 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
10100 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74  , the X.509 cert
10110 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
10120 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65  ed with this ide
10130 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c  ntity is not val
10140 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  id");....return(
10150 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  NULL);..}...retv
10160 61 6c 5f 63 6f 75 6e 74 20 3d 20 31 36 3b 0a 09  al_count = 16;..
10170 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28  retval = malloc(
10180 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
10190 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
101a0 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
101b0 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72  r_type = 0; curr
101c0 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63  _attr_type < 0xc
101d0 65 35 33 36 33 35 66 3b 20 63 75 72 72 5f 61 74  e53635f; curr_at
101e0 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69  tr_type++) {...i
101f0 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  f (curr_attr_typ
10200 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09  e == 0x800) {...
10210 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  .curr_attr_type 
10220 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09  = 0xce536300;...
10230 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65  }....pValue_free
10240 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d   = 0;...pValue =
10250 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65   NULL;...ulValue
10260 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
10270 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  -1;....switch (c
10280 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b  urr_attr_type) {
10290 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  ....case CKA_CLA
102a0 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SS:.....CACKEY_D
102b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
102c0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
102d0 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25  e CKA_CLASS (0x%
102e0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
102f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
10300 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
10310 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  ..ck_object_clas
10320 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b  s = objectclass;
10330 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
10340 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b  ck_object_class;
10350 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
10360 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65  = sizeof(ck_obje
10370 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09  ct_class);......
10380 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10390 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
103a0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
103b0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
103c0 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f  g) *((CK_OBJECT_
103d0 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29  CLASS *) pValue)
103e0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
103f0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
10400 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
10410 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
10420 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  OKEN:.....CACKEY
10430 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
10440 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
10450 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30  ute CKA_TOKEN (0
10460 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
10470 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
10480 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
10490 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
104a0 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
104b0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
104c0 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
104d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
104e0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
104f0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
10500 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
10510 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
10520 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
10530 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
10540 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
10550 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
10560 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45  e CKA_MODIFIABLE
10570 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
10580 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
10590 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
105a0 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28  CKA_MODIFIABLE (
105b0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
105c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
105d0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
105e0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
105f0 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56  k_false;.....ulV
10600 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
10610 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09  (ck_false);.....
10620 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10630 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
10640 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
10650 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
10660 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
10670 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
10680 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
10690 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
106a0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
106b0 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a  case CKA_LABEL:.
106c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
106d0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
106e0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
106f0 41 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c 78  A_LABEL (0x%08lx
10700 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
10710 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
10720 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 2f 2a  r_type);....../*
10730 20 58 58 58 3a 20 44 65 74 65 72 6d 69 6e 65 20   XXX: Determine 
10740 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 75 6c 56 61  name */.....ulVa
10750 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69 6e 74  lueLen = snprint
10760 66 28 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65  f(ucTmpBuf, size
10770 6f 66 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49  of(ucTmpBuf), "I
10780 64 65 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28  dentity #%lu", (
10790 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
107a0 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09  dentity_num);...
107b0 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70  ..pValue = ucTmp
107c0 42 75 66 3b 0a 0a 09 09 09 09 69 66 20 28 75 6c  Buf;......if (ul
107d0 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65  ValueLen >= size
107e0 6f 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a  of(ucTmpBuf)) {.
107f0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
10800 3d 20 30 3b 0a 09 09 09 09 09 70 56 61 6c 75 65  = 0;......pValue
10810 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a   = NULL;.....}..
10820 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10830 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
10840 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
10850 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
10860 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
10870 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
10880 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
10890 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45  VALUE:.....CACKE
108a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
108b0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
108c0 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28  bute CKA_VALUE (
108d0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
108e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
108f0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
10900 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a  .....switch (obj
10910 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09  ectclass) {.....
10920 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54  .case CKO_PRIVAT
10930 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43  E_KEY:.......CAC
10940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10950 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
10960 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
10970 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61  e we are a priva
10980 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09  te key.");......
10990 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
109a0 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  se CKO_PUBLIC_KE
109b0 59 3a 0a 09 09 09 09 09 09 2f 2a 20 58 58 58 3a  Y:......./* XXX:
109c0 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09 09 09 09   TODO */........
109d0 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
109e0 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
109f0 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  :.......pValue =
10a00 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09   certificate;...
10a10 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
10a20 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
10a30 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
10a40 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
10a50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10a60 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
10a70 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
10a80 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10a90 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
10aa0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
10ab0 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09   CKA_ISSUER:....
10ac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10ad0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
10ae0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
10af0 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20  SSUER (0x%08lx) 
10b00 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
10b10 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
10b20 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
10b30 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
10b40 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
10b50 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
10b60 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
10b70 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
10b80 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
10b90 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
10ba0 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62  cate.");.......b
10bb0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
10bc0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
10bd0 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
10be0 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
10bf0 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 72  = x509_to_issuer
10c00 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
10c10 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
10c20 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
10c30 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
10c40 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
10c50 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
10c60 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
10c70 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
10c80 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
10c90 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
10ca0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10cb0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
10cc0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
10cd0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
10ce0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
10cf0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
10d00 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e  ase CKA_SERIAL_N
10d10 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b 45  UMBER:.....CACKE
10d20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10d30 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
10d40 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  bute CKA_SERIAL_
10d50 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78 29  NUMBER (0x%08lx)
10d60 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
10d70 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
10d80 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
10d90 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
10da0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
10db0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
10dc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
10dd0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
10de0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
10df0 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
10e00 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09  icate.");.......
10e10 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
10e20 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
10e30 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
10e40 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
10e50 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61   = x509_to_seria
10e60 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  l(certificate, c
10e70 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
10e80 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
10e90 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
10ea0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
10eb0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
10ec0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
10ed0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
10ee0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
10ef0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
10f00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10f10 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
10f20 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
10f30 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
10f40 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
10f50 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
10f60 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45  ..case CKA_SUBJE
10f70 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  CT:.....CACKEY_D
10f80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
10f90 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
10fa0 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30  e CKA_SUBJECT (0
10fb0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
10fc0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
10fd0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
10fe0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
10ff0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
11000 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
11010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11020 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
11030 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
11040 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
11050 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b   certificate.");
11060 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
11070 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
11080 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
11090 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
110a0 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
110b0 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66  o_subject(certif
110c0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
110d0 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
110e0 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
110f0 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
11100 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
11110 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
11120 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
11130 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
11140 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
11150 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
11160 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
11170 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
11180 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
11190 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
111a0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
111b0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
111c0 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  _ID:.....CACKEY_
111d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
111e0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
111f0 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38  te CKA_ID (0x%08
11200 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
11210 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
11220 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
11230 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28  ucTmpBuf[0] = ((
11240 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31  identity_num + 1
11250 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
11260 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d 20  ....ucTmpBuf[1] 
11270 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d  =  (identity_num
11280 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a 09   + 1) & 0xff;...
11290 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63 54  ...pValue = &ucT
112a0 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c  mpBuf;.....ulVal
112b0 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09  ueLen = 2;......
112c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
112d0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
112e0 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
112f0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
11300 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
11310 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
11320 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46  .case CKA_CERTIF
11330 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 09  ICATE_TYPE:.....
11340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11350 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
11360 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45  attribute CKA_CE
11370 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 28  RTIFICATE_TYPE (
11380 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
11390 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
113a0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
113b0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
113c0 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
113d0 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09  IFICATE) {......
113e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
113f0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
11400 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
11410 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
11420 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29  a certificate.")
11430 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
11440 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20  ...}....../* We 
11450 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65  only support one
11460 20 63 65 72 74 69 66 69 63 61 74 65 20 74 79 70   certificate typ
11470 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74  e */.....ck_cert
11480 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20 43  ificate_type = C
11490 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70  KC_X_509;......p
114a0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 74  Value = &ck_cert
114b0 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 09  ificate_type;...
114c0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
114d0 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 69  izeof(ck_certifi
114e0 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09  cate_type);.....
114f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11500 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
11510 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 28  ning CKC_X_509 (
11520 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20  %lu) (%p/%lu)", 
11530 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
11540 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54  *((CK_CERTIFICAT
11550 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65  E_TYPE *) pValue
11560 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
11570 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
11580 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
11590 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
115a0 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 41  KEY_TYPE:.....CA
115b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
115c0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
115d0 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f  tribute CKA_KEY_
115e0 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e  TYPE (0x%08lx) .
115f0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
11600 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
11610 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
11620 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
11630 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26  O_PRIVATE_KEY &&
11640 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
11650 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20  CKO_PUBLIC_KEY) 
11660 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
11670 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
11680 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
11690 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
116a0 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b  re not a key.");
116b0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
116c0 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f  ..}....../* We o
116d0 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20  nly support one 
116e0 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 09  key type */.....
116f0 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b  ck_key_type = CK
11700 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c  K_RSA;......pVal
11710 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70  ue = &ck_key_typ
11720 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
11730 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65  n = sizeof(ck_ke
11740 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41  y_type);......CA
11750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11760 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
11770 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20  g CKK_RSA (%lu) 
11780 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
11790 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
117a0 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
117b0 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  E *) pValue), pV
117c0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
117d0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
117e0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
117f0 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a  ..case CKA_SIGN:
11800 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
11810 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
11820 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
11830 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c 78  KA_SIGN (0x%08lx
11840 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
11850 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
11860 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
11870 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
11880 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
11890 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
118a0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
118b0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
118c0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
118d0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
118e0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
118f0 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
11900 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
11910 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
11920 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11930 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
11940 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
11950 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
11960 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
11970 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
11980 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
11990 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
119a0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
119b0 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
119c0 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 43 41  _RECOVER:.....CA
119d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
119e0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
119f0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e  tribute CKA_SIGN
11a00 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30 38 6c  _RECOVER (0x%08l
11a10 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
11a20 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
11a30 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 2f  tr_type);....../
11a40 2a 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f  * We currently o
11a50 6e 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67  nly support "Sig
11a60 6e 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22  n with Appendix"
11a70 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d   */.....pValue =
11a80 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
11a90 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
11aa0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a  eof(ck_false);..
11ab0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11ac0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
11ad0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
11ae0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
11af0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
11b00 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
11b10 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
11b20 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
11b30 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
11b40 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52  ...case CKA_DECR
11b50 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  YPT:.....CACKEY_
11b60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11b70 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
11b80 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28  te CKA_DECRYPT (
11b90 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
11ba0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
11bb0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
11bc0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
11bd0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
11be0 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63  ATE_KEY || objec
11bf0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55  tclass == CKO_PU
11c00 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09  BLIC_KEY) {.....
11c10 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
11c20 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
11c30 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
11c40 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
11c50 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
11c60 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
11c70 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
11c80 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
11c90 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
11ca0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11cb0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
11cc0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
11cd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
11ce0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
11cf0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
11d00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
11d10 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
11d20 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
11d30 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09  CKA_SENSITIVE:..
11d40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11d50 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
11d60 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
11d70 5f 53 45 4e 53 49 54 49 56 45 20 28 30 78 25 30  _SENSITIVE (0x%0
11d80 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
11d90 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
11da0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
11db0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
11dc0 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
11dd0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
11de0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
11df0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
11e00 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
11e10 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
11e20 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
11e30 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
11e40 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
11e50 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
11e60 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
11e70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
11e80 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
11e90 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
11ea0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
11eb0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
11ec0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
11ed0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
11ee0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
11ef0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45  k;....case CKA_E
11f00 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09  XTRACTABLE:.....
11f10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11f20 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
11f30 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58  attribute CKA_EX
11f40 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 30 38  TRACTABLE (0x%08
11f50 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
11f60 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
11f70 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
11f80 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
11f90 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
11fa0 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
11fb0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
11fc0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
11fd0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
11fe0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
11ff0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
12000 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
12010 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
12020 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
12030 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
12040 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
12050 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
12060 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
12070 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
12080 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
12090 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
120a0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
120b0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
120c0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
120d0 44 55 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b 45  DULUS:.....CACKE
120e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
120f0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
12100 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  bute CKA_MODULUS
12110 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
12120 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12130 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
12140 3b 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  ;......if (certi
12150 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
12160 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
12170 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
12180 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66 69 63  modulus(certific
12190 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
121a0 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
121b0 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
121c0 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
121d0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
121e0 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
121f0 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
12200 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
12210 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
12220 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12230 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
12240 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
12250 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
12260 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
12270 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
12280 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
12290 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
122a0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
122b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
122c0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
122d0 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
122e0 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ENT (0x%08lx) ..
122f0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
12300 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
12310 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 65  pe);......if (ce
12320 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
12330 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
12340 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
12350 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74  to_exponent(cert
12360 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
12370 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
12380 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
12390 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
123a0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
123b0 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
123c0 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
123d0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
123e0 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
123f0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
12400 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
12410 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
12420 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
12430 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
12440 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
12450 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
12460 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45   CKA_TRUST_SERVE
12470 52 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b  R_AUTH:.....CACK
12480 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12490 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
124a0 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
124b0 53 45 52 56 45 52 5f 41 55 54 48 20 28 30 78 25  SERVER_AUTH (0x%
124c0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
124d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
124e0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
124f0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
12500 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
12510 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
12520 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
12530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12540 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
12550 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
12560 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
12570 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
12580 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
12590 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
125a0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
125b0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
125c0 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54  CKA_TRUST_CLIENT
125d0 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b 45  _AUTH:.....CACKE
125e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
125f0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
12600 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  bute CKA_TRUST_C
12610 4c 49 45 4e 54 5f 41 55 54 48 20 28 30 78 25 30  LIENT_AUTH (0x%0
12620 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
12630 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
12640 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
12650 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
12660 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
12670 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
12680 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
12690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
126a0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
126b0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
126c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
126d0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
126e0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
126f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
12700 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
12710 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
12720 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49  KA_TRUST_CODE_SI
12730 47 4e 49 4e 47 3a 0a 09 09 09 09 43 41 43 4b 45  GNING:.....CACKE
12740 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12750 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
12760 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  bute CKA_TRUST_C
12770 4f 44 45 5f 53 49 47 4e 49 4e 47 20 28 30 78 25  ODE_SIGNING (0x%
12780 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
12790 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
127a0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
127b0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
127c0 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
127d0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
127e0 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
127f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12800 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
12810 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
12820 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
12830 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
12840 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
12850 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
12860 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
12870 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
12880 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f  CKA_TRUST_EMAIL_
12890 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09  PROTECTION:.....
128a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
128b0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
128c0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
128d0 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43  UST_EMAIL_PROTEC
128e0 54 49 4f 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  TION (0x%08lx) .
128f0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
12900 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
12910 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
12920 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
12930 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
12940 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
12950 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12960 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
12970 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
12980 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
12990 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
129a0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
129b0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
129c0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
129d0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
129e0 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
129f0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
12a00 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
12a10 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09   (CK_LONG) -1;..
12a20 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
12a30 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20  .if (((CK_LONG) 
12a40 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28  ulValueLen) != (
12a50 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b  (CK_LONG) -1)) {
12a60 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72  ..../* Push curr
12a70 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73  _attr onto the s
12a80 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f  tack */....curr_
12a90 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72  attr.type = curr
12aa0 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63  _attr_type;....c
12ab0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
12ac0 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  Len = ulValueLen
12ad0 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  ;.....curr_attr.
12ae0 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
12af0 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
12b00 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79  eLen);....memcpy
12b10 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  (curr_attr.pValu
12b20 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  e, pValue, curr_
12b30 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
12b40 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65  ;.....if (pValue
12b50 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29  _free && pValue)
12b60 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c   {.....free(pVal
12b70 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ue);....}.....if
12b80 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65   (numattrs >= re
12b90 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  tval_count) {...
12ba0 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  ..retval_count *
12bb0 3d 20 32 3b 0a 09 09 09 09 72 65 74 76 61 6c 20  = 2;.....retval 
12bc0 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c  = realloc(retval
12bd0 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  , retval_count *
12be0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
12bf0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
12c00 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74  py(&retval[numat
12c10 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72  trs], &curr_attr
12c20 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74  , sizeof(curr_at
12c30 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72  tr));....numattr
12c40 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  s++;...}..}...if
12c50 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29   (numattrs != 0)
12c60 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e   {...retval_coun
12c70 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09  t = numattrs;...
12c80 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63  retval = realloc
12c90 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f  (retval, retval_
12ca0 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
12cb0 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73  retval));..} els
12cc0 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61  e {...free(retva
12cd0 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20  l);....retval = 
12ce0 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43  NULL;..}...*pulC
12cf0 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
12d00 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12d10 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
12d20 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25  g %lu objects (%
12d30 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20  p).", numattrs, 
12d40 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
12d50 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
12d60 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
12d70 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
12d80 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  (struct cackey_i
12d90 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
12da0 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ies, unsigned lo
12db0 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  ng identities_co
12dc0 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49  unt) {..CK_ATTRI
12dd0 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
12de0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
12df0 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78  id_idx, attr_idx
12e00 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69  ;...if (identiti
12e10 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64  es == NULL || id
12e20 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
12e30 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  = 0) {...return;
12e40 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64  ..}...for (id_id
12e50 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20  x = 0; id_idx < 
12e60 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
12e70 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  ; id_idx++) {...
12e80 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69  if (identities[i
12e90 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
12ea0 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74  s) {....for (att
12eb0 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f  r_idx = 0; attr_
12ec0 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73  idx < identities
12ed0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
12ee0 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f  tes_count; attr_
12ef0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72  idx++) {.....cur
12f00 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69  r_attr = &identi
12f10 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
12f20 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78  ributes[attr_idx
12f30 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72  ];......if (curr
12f40 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b  _attr->pValue) {
12f50 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f  ......free(curr_
12f60 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09  attr->pValue);..
12f70 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
12f80 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
12f90 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
12fa0 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e   {.....free(iden
12fb0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
12fc0 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d  ttributes);....}
12fd0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
12fe0 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 69 65  _certs(identitie
12ff0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
13000 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a  dentity, 1, 1);.
13010 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64  ..}..}...free(id
13020 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74  entities);.}..st
13030 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
13040 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  ey_identity *cac
13050 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
13060 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
13070 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
13080 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73  signed long *ids
13090 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63  _found) {..struc
130a0 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
130b0 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
130c0 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74  ntities;..struct
130d0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
130e0 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
130f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
13100 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75  _ids, id_idx, cu
13110 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73  rr_id_type;..uns
13120 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
13130 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a  erts, cert_idx;.
13140 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13150 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
13160 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e  ;...if (ids_foun
13170 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d == NULL) {...C
13180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13190 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f  TF("Error.  ids_
131a0 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b  found is NULL");
131b0 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
131c0 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e  ;..}...pcsc_iden
131d0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
131e0 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c  read_certs(slot,
131f0 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
13200 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64  s);..if (pcsc_id
13210 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
13220 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74  ) {.../* Convert
13230 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73   number of Certs
13240 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62   to number of ob
13250 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69  jects */...num_i
13260 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54  ds = (CKO_PRIVAT
13270 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54  E_KEY - CKO_CERT
13280 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e  IFICATE + 1) * n
13290 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 64 65  um_certs;....ide
132a0 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63  ntities = malloc
132b0 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f  (num_ids * sizeo
132c0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b  f(*identities));
132d0 0a 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a  ....id_idx = 0;.
132e0 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20  ..for (cert_idx 
132f0 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20  = 0; cert_idx < 
13300 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f  num_certs; cert_
13310 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20  idx++) {....for 
13320 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20  (curr_id_type = 
13330 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b  CKO_CERTIFICATE;
13340 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d   curr_id_type <=
13350 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
13360 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b  ; curr_id_type++
13370 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69  ) {.....identiti
13380 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
13390 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
133a0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63 75  et_attributes(cu
133b0 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73  rr_id_type, &pcs
133c0 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
133d0 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78  t_idx], cert_idx
133e0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
133f0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
13400 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 66  _count);......if
13410 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
13420 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
13430 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  == NULL) {......
13440 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
13450 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
13460 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09 7d 0a 0a  unt = 0;.....}..
13470 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
13480 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
13490 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
134a0 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
134b0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
134c0 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d 65  entity));.....me
134d0 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
134e0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
134f0 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64 65  ntity, &pcsc_ide
13500 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
13510 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74  ], sizeof(*ident
13520 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
13530 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a  sc_identity));..
13540 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
13550 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
13560 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
13570 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f  e = malloc(pcsc_
13580 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
13590 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
135a0 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
135b0 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
135c0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
135d0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
135e0 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
135f0 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
13600 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
13610 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
13620 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
13630 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b  n);......id_idx+
13640 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  +;....}...}....c
13650 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
13660 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
13670 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
13680 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d  ....*ids_found =
13690 20 6e 75 6d 5f 69 64 73 3b 0a 09 09 72 65 74 75   num_ids;...retu
136a0 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a  rn(identities);.
136b0 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20  .}...*ids_found 
136c0 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c  = 0;..return(NUL
136d0 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  L);.}..CK_DEFINE
136e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
136f0 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43   C_Initialize)(C
13700 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74  K_VOID_PTR pInit
13710 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e  Args) {..CK_C_IN
13720 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b  ITIALIZE_ARGS CK
13730 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74  _PTR args;..uint
13740 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d  32_t idx;..int m
13750 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a  utex_init_ret;..
13760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13770 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
13780 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67 73  ...if (pInitArgs
13790 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72   != NULL) {...ar
137a0 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a  gs = pInitArgs;.
137b0 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79  ..memcpy(&cackey
137c0 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a  _args, args, siz
137d0 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29  eof(cackey_args)
137e0 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e  );....if (args->
137f0 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e  CreateMutex == N
13800 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73  ULL || args->Des
13810 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  troyMutex == NUL
13820 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d  L || args->LockM
13830 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
13840 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65  args->UnlockMute
13850 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  x == NULL) {....
13860 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65  if (args->Create
13870 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
13880 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75   args->DestroyMu
13890 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
138a0 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21  rgs->LockMutex !
138b0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
138c0 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e  UnlockMutex != N
138d0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
138e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
138f0 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74  Error. Some, but
13900 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69   not All threadi
13910 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72  ng primitives pr
13920 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09  ovided.");......
13930 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
13940 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a  ENTS_BAD);....}.
13950 09 09 7d 0a 0a 09 09 69 66 20 28 61 72 67 73 2d  ..}....if (args-
13960 3e 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  >pReserved != NU
13970 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
13980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
13990 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69  ror. pReserved i
139a0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
139b0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
139c0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
139d0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  }..} else {...ca
139e0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
139f0 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
13a00 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74  cackey_args.Dest
13a10 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  royMutex = NULL;
13a20 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  ...cackey_args.L
13a30 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
13a40 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  ...cackey_args.U
13a50 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c  nlockMutex = NUL
13a60 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
13a70 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  .flags = 0;..}..
13a80 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74  .if (cackey_init
13a90 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
13aa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13ab0 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64  ("Error.  Alread
13ac0 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  y initialized.")
13ad0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
13ae0 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59  CRYPTOKI_ALREADY
13af0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
13b00 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
13b10 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
13b20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
13b30 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
13b40 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
13b50 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
13b60 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
13b70 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
13b80 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
13b90 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
13ba0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
13bb0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
13bc0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
13bd0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
13be0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
13bf0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
13c00 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  dx].pcsc_reader 
13c10 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
13c20 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
13c30 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
13c40 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
13c50 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
13c60 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  t = 0;...cackey_
13c70 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e  slots[idx].token
13c80 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 63 61  _flags = 0;...ca
13c90 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
13ca0 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  label = NULL;..}
13cb0 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61  ...cackey_initia
13cc0 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20  lized = 1;...if 
13cd0 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  (!cackey_biglock
13ce0 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78  _init) {...mutex
13cf0 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b  _init_ret = cack
13d00 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
13d10 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  &cackey_biglock)
13d20 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69  ;....if (mutex_i
13d30 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
13d40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13d50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
13d60 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  Mutex initializa
13d70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a  tion failed.");.
13d80 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
13d90 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a  ANT_LOCK);...}..
13da0 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  ..cackey_biglock
13db0 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09  _init = 1;..}...
13dc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13dd0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
13de0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
13df0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
13e00 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
13e10 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
13e20 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29  _RV, C_Finalize)
13e30 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65  (CK_VOID_PTR pRe
13e40 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74 33  served) {..uint3
13e50 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  2_t idx;...CACKE
13e60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13e70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
13e80 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
13e90 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
13ea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
13eb0 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
13ec0 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
13ed0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
13ee0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
13ef0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
13f00 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
13f10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13f20 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
13f30 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
13f40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
13f50 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
13f60 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  LIZED);..}...for
13f70 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
13f80 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
13f90 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
13fa0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
13fb0 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
13fc0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
13fd0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
13fe0 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73  ive) {....C_Clos
13ff0 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
14000 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  .}..}...cackey_s
14010 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
14020 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64  all();...for (id
14030 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
14040 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
14050 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
14060 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
14070 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
14080 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
14090 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09  pcsc_reader) {..
140a0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
140b0 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65  ots[idx].pcsc_re
140c0 61 64 65 72 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  ader);...}..}...
140d0 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
140e0 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b  onnect();...cack
140f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
14100 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
14110 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
14120 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
14130 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
14140 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
14150 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
14160 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
14170 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54  Info)(CK_INFO_PT
14180 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
14190 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
141a0 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
141b0 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
141c0 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
141d0 55 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79  UTF8CHAR library
141e0 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
141f0 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b  "CACKey";...CACK
14200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14210 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
14220 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
14230 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14240 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14250 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
14260 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
14270 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
14280 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
14290 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
142a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
142b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
142c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
142d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
142e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
142f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
14300 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b  ..pInfo->cryptok
14310 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  iVersion.major =
14320 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
14330 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
14340 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
14350 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
14360 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
14370 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
14380 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
14390 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
143a0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
143b0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
143c0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
143d0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
143e0 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
143f0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
14400 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  , manufacturerID
14410 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63  , sizeof(manufac
14420 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a  turerID) - 1);..
14430 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
14440 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  0x00;...memset(p
14450 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
14460 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
14470 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62  izeof(pInfo->lib
14480 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29  raryDescription)
14490 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
144a0 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
144b0 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73  tion, libraryDes
144c0 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66  cription, sizeof
144d0 28 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  (libraryDescript
144e0 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e  ion) - 1);...pIn
144f0 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69  fo->libraryVersi
14500 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
14510 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
14520 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
14530 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65  pInfo->libraryVe
14540 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
14550 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
14560 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
14570 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14580 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
14590 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
145a0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
145b0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(CKR_OK);.}../*
145c0 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74  . * Process list
145d0 20 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64   of readers, and
145e0 20 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20   create mapping 
145f0 62 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e  between reader n
14600 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a  ame and slot ID.
14610 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
14620 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
14630 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f  GetSlotList)(CK_
14640 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65  BBOOL tokenPrese
14650 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50  nt, CK_SLOT_ID_P
14660 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b  TR pSlotList, CK
14670 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
14680 75 6e 74 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  unt) {..int mute
14690 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70  x_retval;..int p
146a0 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b  csc_connect_ret;
146b0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74  ..CK_ULONG count
146c0 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30  , slot_count = 0
146d0 2c 20 63 75 72 72 73 6c 6f 74 3b 0a 09 63 68 61  , currslot;..cha
146e0 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 2c  r *pcsc_readers,
146f0 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73   *pcsc_readers_s
14700 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , *pcsc_readers_
14710 65 3b 0a 09 44 57 4f 52 44 20 70 63 73 63 5f 72  e;..DWORD pcsc_r
14720 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e  eaders_len;..LON
14730 47 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  G scard_listread
14740 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74  ers_ret;..size_t
14750 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
14760 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
14770 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
14780 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75  ");...if (pulCou
14790 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
147a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
147b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 43  NTF("Error. pulC
147c0 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ount is NULL.");
147d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
147e0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
147f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
14800 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
14810 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14820 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
14830 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
14840 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
14850 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
14860 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
14870 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
14880 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
14890 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
148a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
148b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
148c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
148d0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
148e0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
148f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
14900 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
14910 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74 20 6f  ./* Clear list o
14920 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 69 66 20 28  f slots */..if (
14930 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 43  pSlotList) {...C
14940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14950 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c 6c 20  TF("Purging all 
14960 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
14970 2e 22 29 3b 0a 0a 09 09 2f 2a 20 4f 6e 6c 79 20  .");..../* Only 
14980 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
14990 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
149a0 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
149b0 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  g supply the slo
149c0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
149d0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
149e0 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
149f0 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c  ;....for (currsl
14a00 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
14a10 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
14a20 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
14a30 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
14a40 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
14a50 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79   {....if (cackey
14a60 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
14a70 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a  .pcsc_reader) {.
14a80 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
14a90 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
14aa0 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
14ab0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
14ac0 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
14ad0 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09  eader = NULL;...
14ae0 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65  .}.....if (cacke
14af0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
14b00 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 09 66  ].label) {.....f
14b10 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ree(cackey_slots
14b20 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c  [currslot].label
14b30 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  );......cackey_s
14b40 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
14b50 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  abel = NULL;....
14b60 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  }.....cackey_slo
14b70 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
14b80 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 0a  ive = 0;...}..}.
14b90 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6c  ../* Determine l
14ba0 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20 2a  ist of readers *
14bb0 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  /..pcsc_connect_
14bc0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73  ret = cackey_pcs
14bd0 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66  c_connect();..if
14be0 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
14bf0 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
14c00 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
14c10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14c20 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50  "Connection to P
14c30 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61 73 73  C/SC failed, ass
14c40 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 29  uming no slots")
14c50 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20  ;....slot_count 
14c60 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 0;..} else {..
14c70 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  .pcsc_readers_le
14c80 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f  n = 0;....scard_
14c90 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20  listreaders_ret 
14ca0 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  = SCardListReade
14cb0 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  rs(*cackey_pcsc_
14cc0 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55  handle, NULL, NU
14cd0 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72  LL, &pcsc_reader
14ce0 73 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73 63  s_len);...if (sc
14cf0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
14d00 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53  ret == SCARD_S_S
14d10 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f 72  UCCESS && pcsc_r
14d20 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29  eaders_len != 0)
14d30 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65   {....pcsc_reade
14d40 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63  rs = malloc(pcsc
14d50 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
14d60 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73  ..pcsc_readers_s
14d70 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b   = pcsc_readers;
14d80 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72  .....scard_listr
14d90 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61  eaders_ret = SCa
14da0 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63  rdListReaders(*c
14db0 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
14dc0 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65  e, NULL, pcsc_re
14dd0 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61  aders, &pcsc_rea
14de0 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66  ders_len);....if
14df0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
14e00 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
14e10 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
14e20 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  ..pcsc_readers_e
14e30 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 20   = pcsc_readers 
14e40 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  + pcsc_readers_l
14e50 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72  en;....../* Star
14e60 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31  t with Slot ID 1
14e70 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67  , to avoid a bug
14e80 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20   in GDM on RHEL 
14e90 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39  */...../* Bug 59
14ea0 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75  4911: https://bu
14eb0 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f  gzilla.redhat.co
14ec0 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  m/show_bug.cgi?i
14ed0 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09  d=594911 */.....
14ee0 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09  currslot = 1;...
14ef0 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65  ..while (pcsc_re
14f00 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61  aders < pcsc_rea
14f10 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 63  ders_e) {......c
14f20 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
14f30 20 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61   strlen(pcsc_rea
14f40 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20  ders);.......if 
14f50 28 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ((pcsc_readers +
14f60 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
14f70 29 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73  ) > pcsc_readers
14f80 5f 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  _e) {.......brea
14f90 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
14fa0 69 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f  if (curr_reader_
14fb0 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  len == 0) {.....
14fc0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
14fd0 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c  ......if (currsl
14fe0 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ot >= (sizeof(ca
14ff0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
15000 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
15010 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09  s[0]))) {.......
15020 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15030 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20  NTF("Found more 
15040 72 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f  readers than slo
15050 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ts are available
15060 21 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  !");........brea
15070 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
15080 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15090 4e 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65  NTF("Found reade
150a0 72 3a 20 25 73 22 2c 20 70 63 73 63 5f 72 65 61  r: %s", pcsc_rea
150b0 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 2f 2a 20  ders);......./* 
150c0 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  Only update the 
150d0 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66  list of slots if
150e0 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79   we are actually
150f0 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73 75 70   being asked sup
15100 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66  ply the slot inf
15110 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  ormation */.....
15120 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
15130 7b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  {.......cackey_s
15140 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
15150 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09  ctive = 1;......
15160 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
15170 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
15180 64 65 72 20 3d 20 73 74 72 64 75 70 28 70 63 73  der = strdup(pcs
15190 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09  c_readers);.....
151a0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
151b0 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61  urrslot].pcsc_ca
151c0 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
151d0 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
151e0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
151f0 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
15200 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b   = 0;.......cack
15210 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
15220 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  t].slot_reset = 
15230 31 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  1;.......cackey_
15240 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
15250 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
15260 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
15270 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
15280 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
15290 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  abel = NULL;....
152a0 09 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f  ..}......currslo
152b0 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f  t++;.......pcsc_
152c0 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f  readers += curr_
152d0 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a  reader_len + 1;.
152e0 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 53 74  ....}....../* St
152f0 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44  art with Slot ID
15300 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62   1, to avoid a b
15310 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45  ug in GDM on RHE
15320 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20  L */...../* Bug 
15330 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f  594911: https://
15340 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e  bugzilla.redhat.
15350 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69  com/show_bug.cgi
15360 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09  ?id=594911 */...
15370 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e  ..if (currslot >
15380 20 31 29 20 7b 0a 09 09 09 09 09 2f 2a 20 53 74   1) {....../* St
15390 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44  art with Slot ID
153a0 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62   1, to avoid a b
153b0 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45  ug in GDM on RHE
153c0 4c 20 2a 2f 0a 09 09 09 09 09 2f 2a 20 42 75 67  L */....../* Bug
153d0 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f   594911: https:/
153e0 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74  /bugzilla.redhat
153f0 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67  .com/show_bug.cg
15400 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09  i?id=594911 */..
15410 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d  ....slot_count =
15420 20 63 75 72 72 73 6c 6f 74 20 2d 20 31 3b 0a 09   currslot - 1;..
15430 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
15440 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15450 47 5f 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64  G_PRINTF("Second
15460 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69   call to SCardLi
15470 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64  stReaders failed
15480 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22  , return %s/%li"
15490 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
154a0 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
154b0 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65  STR(scard_listre
154c0 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e  aders_ret), (lon
154d0 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61  g) scard_listrea
154e0 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a  ders_ret);....}.
154f0 0a 09 09 09 66 72 65 65 28 70 63 73 63 5f 72 65  ....free(pcsc_re
15500 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c  aders_s);...} el
15510 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
15520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72  EBUG_PRINTF("Fir
15530 73 74 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64  st call to SCard
15540 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c  ListReaders fail
15550 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c  ed, return %s/%l
15560 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  i", CACKEY_DEBUG
15570 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
15580 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74  O_STR(scard_list
15590 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c  readers_ret), (l
155a0 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72  ong) scard_listr
155b0 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d  eaders_ret);...}
155c0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
155d0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
155e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
155f0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
15600 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
15610 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15620 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15630 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
15640 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
15650 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
15660 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ROR);..}...if (p
15670 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  SlotList == NULL
15680 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20  ) {...*pulCount 
15690 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09  = slot_count;...
156a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
156b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
156c0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
156d0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
156e0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63  (CKR_OK);..}...c
156f0 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74  ount = *pulCount
15700 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73  ;..if (count < s
15710 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43  lot_count) {...C
15720 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15730 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20  TF("Error. User 
15740 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e  allocated %lu en
15750 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68 61  tries, but we ha
15760 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22  ve %lu entries."
15770 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f  , count, slot_co
15780 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
15790 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
157a0 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 66 6f 72  MALL);...}...for
157b0 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
157c0 63 75 72 72 73 6c 6f 74 20 3c 20 73 6c 6f 74 5f  currslot < slot_
157d0 63 6f 75 6e 74 3b 20 63 75 72 72 73 6c 6f 74 2b  count; currslot+
157e0 2b 29 20 7b 0a 09 09 2f 2a 20 53 74 61 72 74 20  +) {.../* Start 
157f0 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20  with Slot ID 1, 
15800 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69  to avoid a bug i
15810 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f  n GDM on RHEL */
15820 0a 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31  .../* Bug 594911
15830 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c  : https://bugzil
15840 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68  la.redhat.com/sh
15850 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39  ow_bug.cgi?id=59
15860 34 39 31 31 20 2a 2f 0a 09 09 70 53 6c 6f 74 4c  4911 */...pSlotL
15870 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d 20 3d 20  ist[currslot] = 
15880 63 75 72 72 73 6c 6f 74 20 2b 20 31 3b 0a 09 7d  currslot + 1;..}
15890 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73  ...*pulCount = s
158a0 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43  lot_count;...CAC
158b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
158c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
158d0 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20  OK (%i).  Found 
158e0 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43  %lu readers.", C
158f0 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64  KR_OK, (unsigned
15900 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e   long) slot_coun
15910 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  t);...return(CKR
15920 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65  _OK);...tokenPre
15930 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73  sent = tokenPres
15940 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20  ent; /* Supress 
15950 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20  unused variable 
15960 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b  warning */.}..CK
15970 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
15980 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
15990 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  tInfo)(CK_SLOT_I
159a0 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f  D slotID, CK_SLO
159b0 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  T_INFO_PTR pInfo
159c0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
159d0 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63  TF8CHAR slotDesc
159e0 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43  ription[] = "CAC
159f0 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20  Key Slot";..int 
15a00 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
15a10 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  nt bytes_to_copy
15a20 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
15a30 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
15a40 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
15a50 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
15a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15a70 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
15a80 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
15a90 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
15aa0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
15ab0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
15ac0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
15ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15ae0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
15af0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
15b00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
15b10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
15b20 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
15b30 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
15b40 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
15b50 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
15b60 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
15b70 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
15b80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15b90 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
15ba0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
15bb0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
15bc0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
15bd0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
15be0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
15bf0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
15c00 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
15c10 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
15c20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
15c30 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
15c40 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
15c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15c60 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
15c70 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
15c80 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
15c90 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
15ca0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
15cb0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
15cc0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
15cd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
15ce0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
15cf0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
15d00 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
15d10 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
15d20 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
15d30 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
15d40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
15d50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
15d60 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
15d70 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  }...pInfo->flags
15d80 20 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45   = CKF_REMOVABLE
15d90 5f 44 45 56 49 43 45 20 7c 20 43 4b 46 5f 48 57  _DEVICE | CKF_HW
15da0 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 63 61 63  _SLOT;...if (cac
15db0 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
15dc0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
15dd0 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b  slotID]) == CACK
15de0 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
15df0 52 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66  RESENT) {...pInf
15e00 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  o->flags |= CKF_
15e10 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09  TOKEN_PRESENT;..
15e20 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  }...bytes_to_cop
15e30 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65  y = strlen(cacke
15e40 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
15e50 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69  pcsc_reader);..i
15e60 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  f (sizeof(pInfo-
15e70 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
15e80 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   < bytes_to_copy
15e90 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63  ) {...bytes_to_c
15ea0 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e  opy = sizeof(pIn
15eb0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
15ec0 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28  ID);..}..memcpy(
15ed0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
15ee0 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c  rerID, cackey_sl
15ef0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63  ots[slotID].pcsc
15f00 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74  _reader, bytes_t
15f10 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78  o_copy);...mutex
15f20 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
15f30 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
15f40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
15f50 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
15f60 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
15f70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15f80 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
15f90 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
15fa0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
15fb0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
15fc0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c  memset(pInfo->sl
15fd0 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  otDescription, '
15fe0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
15ff0 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
16000 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  n));..memcpy(pIn
16010 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
16020 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70  ion, slotDescrip
16030 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f  tion, sizeof(slo
16040 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  tDescription) - 
16050 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
16060 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
16070 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
16080 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
16090 72 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f  rerID));...pInfo
160a0 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
160b0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
160c0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
160d0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
160e0 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
160f0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
16100 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
16110 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
16120 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
16130 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
16140 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
16150 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
16160 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
16170 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16180 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
16190 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
161a0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
161b0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
161c0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
161d0 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49  _RV, C_GetTokenI
161e0 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
161f0 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e  slotID, CK_TOKEN
16200 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
16210 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
16220 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
16230 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
16240 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
16250 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
16260 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20   defaultLabel[] 
16270 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e  = "Unknown Token
16280 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
16290 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d  F8CHAR model[] =
162a0 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73   "CAC Token";..s
162b0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
162c0 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
162d0 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
162e0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
162f0 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20  certs;..ssize_t 
16300 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20  label_ret;..int 
16310 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
16320 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  nt use_default_l
16330 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  abel;...CACKEY_D
16340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
16350 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
16360 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
16370 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16380 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
16390 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
163a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
163b0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
163c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
163d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
163e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
163f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
16400 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
16410 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
16420 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
16430 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
16440 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
16450 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
16460 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
16470 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
16480 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
16490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
164a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
164b0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
164c0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
164d0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
164e0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
164f0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
16500 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
16510 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
16520 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
16530 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
16540 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
16550 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
16560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16570 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
16580 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
16590 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
165a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
165b0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
165c0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
165d0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
165e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
165f0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
16600 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
16610 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
16620 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
16630 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
16640 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
16650 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
16660 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
16670 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
16680 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
16690 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
166a0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
166b0 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45  lotID]) != CACKE
166c0 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
166d0 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45  ESENT) {...CACKE
166e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
166f0 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73  No token is pres
16700 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20  ent in slotID = 
16710 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  %lu", slotID);..
16720 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
16730 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
16740 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
16750 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50  (CKR_TOKEN_NOT_P
16760 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75  RESENT);..}...mu
16770 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
16780 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
16790 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
167a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
167b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
167c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
167d0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
167e0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
167f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
16800 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
16810 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
16820 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d  token label from
16830 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
16840 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
16850 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65  label, ' ', size
16860 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
16870 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  );..use_default_
16880 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20  label = 1;...if 
16890 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
168a0 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e  otID].label == N
168b0 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64  ULL) {...pcsc_id
168c0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
168d0 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63 61  y_read_certs(&ca
168e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
168f0 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  D], NULL, &num_c
16900 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73  erts);...if (pcs
16910 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
16920 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e  NULL) {....if (n
16930 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a  um_certs > 0) {.
16940 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20  ....label_ret = 
16950 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
16960 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63  tity_to_label(pc
16970 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70  sc_identities, p
16980 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
16990 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
169a0 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65  ));.....if (labe
169b0 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09  l_ret > 0) {....
169c0 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
169d0 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63  bel = 0;.......c
169e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
169f0 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c  ID].label = mall
16a00 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  oc(sizeof(pInfo-
16a10 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09  >label));.......
16a20 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c  memcpy(cackey_sl
16a30 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
16a40 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  l, pInfo->label,
16a50 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
16a60 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09  abel));.....}...
16a70 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
16a80 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
16a90 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
16aa0 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20  rts, 1);...}..} 
16ab0 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
16ac0 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61  pInfo->label, ca
16ad0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
16ae0 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  D].label, sizeof
16af0 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
16b00 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  ....use_default_
16b10 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09  label = 0;..}...
16b20 69 66 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f  if (use_default_
16b30 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70  label) {...memcp
16b40 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  y(pInfo->label, 
16b50 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69  defaultLabel, si
16b60 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65  zeof(defaultLabe
16b70 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65  l) - 1);..}...me
16b80 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
16b90 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
16ba0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
16bb0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
16bc0 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
16bd0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
16be0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
16bf0 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75  sizeof(manufactu
16c00 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d  rerID) - 1);...m
16c10 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emset(pInfo->mod
16c20 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  el, ' ', sizeof(
16c30 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a  pInfo->model));.
16c40 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
16c50 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a  odel, model, siz
16c60 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b  eof(model) - 1);
16c70 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
16c80 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27  >serialNumber, '
16c90 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
16ca0 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29  ->serialNumber))
16cb0 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
16cc0 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20  ->utcTime, ' ', 
16cd0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74  sizeof(pInfo->ut
16ce0 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f  cTime));...pInfo
16cf0 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
16d00 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
16d10 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
16d20 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
16d30 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
16d40 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
16d50 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
16d60 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
16d70 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
16d80 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
16d90 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
16da0 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
16db0 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
16dc0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
16dd0 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  KF_WRITE_PROTECT
16de0 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49  ED | CKF_USER_PI
16df0 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
16e00 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41  CKF_TOKEN_INITIA
16e10 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73  LIZED | cackey_s
16e20 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
16e30 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 70 49 6e 66  en_flags;...pInf
16e40 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43  o->ulMaxSessionC
16e50 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63  ount = (sizeof(c
16e60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
16e70 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
16e80 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20  sessions[0])) - 
16e90 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73  1;..pInfo->ulSes
16ea0 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55  sionCount = CK_U
16eb0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
16ec0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
16ed0 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f  ulMaxRwSessionCo
16ee0 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  unt = 0;..pInfo-
16ef0 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  >ulRwSessionCoun
16f00 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  t = CK_UNAVAILAB
16f10 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
16f20 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e  .pInfo->ulMaxPin
16f30 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66  Len = 128;..pInf
16f40 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d  o->ulMinPinLen =
16f50 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f   0;..pInfo->ulTo
16f60 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  talPublicMemory 
16f70 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
16f80 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
16f90 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c  Info->ulFreePubl
16fa0 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  icMemory = CK_UN
16fb0 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
16fc0 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
16fd0 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d  lTotalPrivateMem
16fe0 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
16ff0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
17000 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65  ;..pInfo->ulFree
17010 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
17020 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
17030 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41  NFORMATION;...CA
17040 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17050 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
17060 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
17070 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
17080 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
17090 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
170a0 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74  V, C_WaitForSlot
170b0 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20  Event)(CK_FLAGS 
170c0 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49  flags, CK_SLOT_I
170d0 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43  D_PTR pSlotID, C
170e0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65  K_VOID_PTR pRese
170f0 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f  rved) {..CACKEY_
17100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
17110 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
17120 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c  Reserved != NULL
17130 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17140 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17150 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e  . pReserved is n
17160 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
17170 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
17180 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
17190 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
171a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
171b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
171c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
171d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
171e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
171f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
17200 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
17210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17220 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
17230 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
17240 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
17250 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
17260 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
17270 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
17280 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
17290 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
172a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
172b0 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28  tMechanismList)(
172c0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
172d0 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  D, CK_MECHANISM_
172e0 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e  TYPE_PTR pMechan
172f0 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  ismList, CK_ULON
17300 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
17310 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
17320 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
17330 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
17340 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
17350 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17360 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
17370 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
17380 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
17390 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
173a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
173b0 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d  .if (pulCount ==
173c0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
173d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
173e0 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74  Error.  pulCount
173f0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
17400 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
17410 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
17420 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69  if (pMechanismLi
17430 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
17440 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 33 3b 0a 0a  *pulCount = 3;..
17450 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17460 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
17470 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
17480 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
17490 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
174a0 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20  if (*pulCount < 
174b0 33 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  3) {...CACKEY_DE
174c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
174d0 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73  r.  Buffer too s
174e0 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  mall.");....retu
174f0 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  rn(CKR_BUFFER_TO
17500 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70  O_SMALL);..}...p
17510 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d  MechanismList[0]
17520 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b   = CKM_RSA_PKCS;
17530 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  ..pMechanismList
17540 5b 31 5d 20 3d 20 43 4b 4d 5f 53 48 41 31 5f 52  [1] = CKM_SHA1_R
17550 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f  SA_PKCS;..*pulCo
17560 75 6e 74 20 3d 20 32 3b 0a 0a 09 43 41 43 4b 45  unt = 2;...CACKE
17570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17580 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
17590 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
175a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
175b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
175c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
175d0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
175e0 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
175f0 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
17600 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43  ISM_TYPE type, C
17610 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f  K_MECHANISM_INFO
17620 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
17630 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
17640 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17650 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
17660 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
17670 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
17680 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17690 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
176a0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
176b0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
176c0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
176d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
176e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
176f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17700 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
17710 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
17720 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
17730 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
17740 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
17750 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
17760 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
17770 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
17780 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
17790 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
177a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
177b0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
177c0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
177d0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
177e0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
177f0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
17800 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
17810 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
17820 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
17830 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
17840 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
17850 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
17860 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
17870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17880 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
17890 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
178a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
178b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
178c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
178d0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
178e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
178f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17900 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
17910 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
17920 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
17930 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
17940 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
17950 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
17960 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
17970 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
17980 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
17990 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
179a0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
179b0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
179c0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
179d0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
179e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
179f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
17a00 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
17a10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
17a20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
17a30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20  );..}.../* XXX: 
17a40 54 68 69 73 20 69 73 20 75 6e 74 65 73 74 65 64  This is untested
17a50 2c 20 61 6e 64 20 66 75 72 74 68 65 72 20 49 27  , and further I'
17a60 6d 20 6e 6f 74 20 72 65 61 6c 6c 79 20 73 75 72  m not really sur
17a70 65 20 69 66 20 74 68 69 73 20 69 73 20 63 6f 72  e if this is cor
17a80 72 65 63 74 2e 20 2a 2f 0a 09 73 77 69 74 63 68  rect. */..switch
17a90 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65   (type) {...case
17aa0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
17ab0 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65  ..pInfo->ulMinKe
17ac0 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09  ySize = 512;....
17ad0 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53  pInfo->ulMaxKeyS
17ae0 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70  ize = 8192;....p
17af0 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
17b00 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59  F_HW | CKF_ENCRY
17b10 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54  PT | CKF_DECRYPT
17b20 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b   | CKF_SIGN | CK
17b30 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65  F_VERIFY;....bre
17b40 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ak;...case CKM_R
17b50 53 41 5f 58 5f 35 30 39 3a 0a 09 09 09 70 49 6e  SA_X_509:....pIn
17b60 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
17b70 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
17b80 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
17b90 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
17ba0 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
17bb0 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
17bc0 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
17bd0 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
17be0 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
17bf0 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52  .case CKM_SHA1_R
17c00 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66  SA_PKCS:....pInf
17c10 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20  o->ulMinKeySize 
17c20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d  = 512;....pInfo-
17c30 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20  >ulMaxKeySize = 
17c40 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e  8192;....pInfo->
17c50 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c  flags = CKF_HW |
17c60 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f   CKF_SIGN | CKF_
17c70 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b  VERIFY;....break
17c80 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
17c90 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
17ca0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
17cb0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
17cc0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
17cd0 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
17ce0 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
17cf0 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
17d00 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
17d10 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f  C_InitToken)(CK_
17d20 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
17d30 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
17d40 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
17d50 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  lPinLen, CK_UTF8
17d60 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29  CHAR_PTR pLabel)
17d70 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
17d80 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
17d90 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
17da0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
17db0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17dc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
17dd0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
17de0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
17df0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
17e00 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
17e10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17e20 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
17e30 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
17e40 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
17e50 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
17e60 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
17e70 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
17e80 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
17e90 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
17ea0 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
17eb0 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
17ec0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
17ed0 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43  RV, C_InitPIN)(C
17ee0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
17ef0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54   hSession, CK_UT
17f00 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
17f10 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
17f20 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
17f30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
17f40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
17f50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
17f60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17f70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17f80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
17f90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
17fa0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
17fb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
17fc0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
17fd0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
17fe0 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
17ff0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
18000 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
18010 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
18020 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
18030 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
18040 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
18050 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
18060 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
18070 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
18080 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29  CK_RV, C_SetPIN)
18090 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
180a0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
180b0 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c  UTF8CHAR_PTR pOl
180c0 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  dPin, CK_ULONG u
180d0 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  lOldPinLen, CK_U
180e0 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77  TF8CHAR_PTR pNew
180f0 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
18100 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41  NewPinLen) {..CA
18110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18120 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
18130 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
18140 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
18150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18160 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
18170 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
18180 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
18190 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
181a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
181b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
181c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
181d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
181e0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
181f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
18200 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
18210 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
18220 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
18230 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
18240 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f  CTION(CK_RV, C_O
18250 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  penSession)(CK_S
18260 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
18270 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43  K_FLAGS flags, C
18280 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
18290 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49  ication, CK_NOTI
182a0 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45  FY notify, CK_SE
182b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52  SSION_HANDLE_PTR
182c0 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75   phSession) {..u
182d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78  nsigned long idx
182e0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
182f0 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f  val;..int found_
18300 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43  session = 0;...C
18310 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18320 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
18330 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b  .if ((flags & CK
18340 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e  F_SERIAL_SESSION
18350 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f  ) != CKF_SERIAL_
18360 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74  SESSION) {...ret
18370 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
18380 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50  PARALLEL_NOT_SUP
18390 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  PORTED);..}...if
183a0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
183b0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
183c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
183d0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
183e0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
183f0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
18400 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
18410 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
18420 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
18430 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
18440 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
18450 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
18460 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
18470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18480 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
18490 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
184a0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
184b0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
184c0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
184d0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
184e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
184f0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
18500 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
18510 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
18520 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
18530 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
18540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18550 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
18560 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
18570 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
18580 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
18590 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
185a0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
185b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
185c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
185d0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
185e0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
185f0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
18600 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
18610 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
18620 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
18630 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
18640 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
18650 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
18660 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
18670 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61  at the card is a
18680 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73  ctually in the s
18690 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a  lot. */../* XXX:
186a0 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
186b0 75 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74  ure this is in t
186c0 68 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69  he PKCS#11 speci
186d0 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  fication */..if 
186e0 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
186f0 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
18700 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
18710 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
18720 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
18730 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18740 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72  NTF("Error.  Car
18750 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20  d not present.  
18760 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45  Returning CKR_DE
18770 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a  VICE_REMOVED");.
18780 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
18790 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
187a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
187b0 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  n(CKR_DEVICE_REM
187c0 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  OVED);..}...for 
187d0 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20  (idx = 1; idx < 
187e0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
187f0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
18800 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
18810 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
18820 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
18830 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
18840 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f  ive) {....found_
18850 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09  session = 1;....
18860 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64  .*phSession = id
18870 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  x;.....cackey_se
18880 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
18890 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65  ve = 1;....cacke
188a0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
188b0 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b  slotID = slotID;
188c0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
188d0 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d  ons[idx].state =
188e0 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53   CKS_RO_PUBLIC_S
188f0 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65  ESSION;....cacke
18900 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
18910 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09  flags = flags;..
18920 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
18930 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45  s[idx].ulDeviceE
18940 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63  rror = 0;....cac
18950 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
18960 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d  ].pApplication =
18970 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09   pApplication;..
18980 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
18990 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20  s[idx].Notify = 
189a0 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b  notify;.....cack
189b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
189c0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55  .identities = NU
189d0 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  LL;....cackey_se
189e0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
189f0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
18a00 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
18a10 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63  sions[idx].searc
18a20 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
18a30 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
18a40 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69  s[idx].sign_acti
18a50 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
18a60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
18a70 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
18a80 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
18a90 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
18aa0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
18ab0 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
18ac0 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
18ad0 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79  slotID], &cackey
18ae0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
18af0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
18b00 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
18b10 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
18b20 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
18b30 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
18b40 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
18b50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
18b60 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
18b70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18b80 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
18b90 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
18ba0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
18bb0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
18bc0 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20  !found_session) 
18bd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18be0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
18bf0 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ng CKR_SESSION_C
18c00 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f  OUNT (%i)", CKR_
18c10 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
18c20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
18c30 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d  SSION_COUNT);..}
18c40 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18c50 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
18c60 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
18c70 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
18c80 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
18c90 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
18ca0 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53  (CK_RV, C_CloseS
18cb0 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  ession)(CK_SESSI
18cc0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
18cd0 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  on) {..int mutex
18ce0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
18cf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18d00 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
18d10 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
18d20 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
18d30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18d40 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
18d50 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
18d60 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
18d70 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
18d80 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
18d90 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
18da0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
18db0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
18dc0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
18dd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
18de0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
18df0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18e00 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
18e10 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
18e20 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
18e30 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
18e40 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
18e50 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
18e60 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
18e70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
18e80 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
18e90 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
18ea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18eb0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
18ec0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
18ed0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
18ee0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
18ef0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18f00 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
18f10 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
18f20 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
18f30 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
18f40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18f50 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
18f60 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
18f70 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
18f80 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
18f90 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
18fa0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18fb0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
18fc0 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72   = 0;..cackey_fr
18fd0 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
18fe0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
18ff0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
19000 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
19010 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
19020 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
19030 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
19040 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
19050 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
19060 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
19070 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
19080 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19090 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
190a0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
190b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
190c0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
190d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
190e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
190f0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
19100 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
19110 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
19120 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
19130 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
19140 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29  loseAllSessions)
19150 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
19160 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  ID) {..uint32_t 
19170 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
19180 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
19190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
191a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
191b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
191c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
191d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
191e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
191f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
19200 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
19210 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
19220 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
19230 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
19240 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
19250 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
19260 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
19270 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
19280 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19290 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
192a0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
192b0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
192c0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
192d0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
192e0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
192f0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
19300 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
19310 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
19320 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
19330 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
19340 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
19350 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
19360 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
19370 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
19380 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
19390 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
193a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
193b0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
193c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
193d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
193e0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
193f0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
19400 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
19410 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
19420 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
19430 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
19440 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
19450 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
19460 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
19470 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
19480 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
19490 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
194a0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
194b0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
194c0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
194d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
194e0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69  ].active) {....i
194f0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
19500 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21  ns[idx].slotID !
19510 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09  = slotID) {.....
19520 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
19530 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
19540 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
19550 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f  glock);....C_Clo
19560 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a  seSession(idx);.
19570 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
19580 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
19590 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ock);...}..}...m
195a0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
195b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
195c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
195d0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
195e0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
195f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19600 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
19610 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
19620 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
19630 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
19640 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
19650 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
19660 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
19670 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
19680 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
19690 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
196a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65  N(CK_RV, C_GetSe
196b0 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45  ssionInfo)(CK_SE
196c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
196d0 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f  ssion, CK_SESSIO
196e0 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  N_INFO_PTR pInfo
196f0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
19700 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
19710 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
19720 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
19730 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
19740 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19750 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
19760 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
19770 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
19780 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
19790 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
197a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
197b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
197c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
197d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
197e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
197f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
19800 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
19810 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
19820 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
19830 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
19840 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
19850 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
19860 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
19870 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19880 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
19890 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
198a0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
198b0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
198c0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
198d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
198e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
198f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
19900 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
19910 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
19920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19930 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
19940 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
19950 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
19960 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
19970 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
19980 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
19990 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
199a0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
199b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
199c0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
199d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
199e0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
199f0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
19a00 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
19a10 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
19a20 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f  ..}...pInfo->slo
19a30 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
19a40 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
19a50 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e  slotID;..pInfo->
19a60 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73  state = cackey_s
19a70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
19a80 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d  ].state;..pInfo-
19a90 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f  >flags = cackey_
19aa0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
19ab0 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f  n].flags;..pInfo
19ac0 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20  ->ulDeviceError 
19ad0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
19ae0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65  s[hSession].ulDe
19af0 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74  viceError;...mut
19b00 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
19b10 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
19b20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19b30 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
19b40 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
19b50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19b60 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
19b70 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
19b80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
19b90 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
19ba0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19bb0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
19bc0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
19bd0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
19be0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
19bf0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
19c00 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72  CK_RV, C_GetOper
19c10 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
19c20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
19c30 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
19c40 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
19c50 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ate, CK_ULONG_PT
19c60 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  R pulOperationSt
19c70 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ateLen) {..CACKE
19c80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19c90 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
19ca0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
19cb0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
19cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19cd0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
19ce0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
19cf0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
19d00 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
19d10 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
19d20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19d30 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
19d40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
19d50 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
19d60 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
19d70 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
19d80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
19d90 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
19da0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
19db0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f  ON(CK_RV, C_SetO
19dc0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
19dd0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
19de0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
19df0 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
19e00 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
19e10 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74   ulOperationStat
19e20 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  eLen, CK_OBJECT_
19e30 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69  HANDLE hEncrypti
19e40 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  onKey, CK_OBJECT
19e50 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74  _HANDLE hAuthent
19e60 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43  icationKey) {..C
19e70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19e80 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
19e90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
19ea0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
19eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19ec0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
19ed0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
19ee0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
19ef0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
19f00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
19f10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19f20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
19f30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
19f40 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
19f50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
19f60 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
19f70 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
19f80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
19f90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
19fa0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
19fb0 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f  Login)(CK_SESSIO
19fc0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
19fd0 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20  n, CK_USER_TYPE 
19fe0 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46  userType, CK_UTF
19ff0 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
1a000 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
1a010 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  n) {..CK_SLOT_ID
1a020 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75   slotID;..int mu
1a030 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1a040 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
1a050 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74  ;..int login_ret
1a060 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1a070 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1a080 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1a090 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1a0a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a0b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a0c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1a0d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a0e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1a0f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1a100 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1a110 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1a120 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1a130 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1a140 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1a150 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1a160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a170 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1a180 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1a190 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1a1a0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1a1b0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1a1c0 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70 65 20  ...if (userType 
1a1d0 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09  != CKU_USER) {..
1a1e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a1f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65  INTF("Error.  We
1a200 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53   only support US
1a210 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66  ER mode, asked f
1a220 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28  or %lu mode.", (
1a230 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1a240 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75  serType)....retu
1a250 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45  rn(CKR_USER_TYPE
1a260 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1a270 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1a280 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1a290 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1a2a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1a2b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1a2c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a2d0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1a2e0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1a2f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1a300 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1a310 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1a320 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1a330 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1a340 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1a350 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1a360 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a370 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a380 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1a390 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1a3a0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1a3b0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1a3c0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
1a3d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a3e0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
1a3f0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1a400 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1a410 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1a420 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1a430 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1a440 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a450 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a460 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1a470 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1a480 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1a490 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1a4a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1a4b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1a4c0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1a4d0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
1a4e0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
1a4f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a500 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1a510 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1a520 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
1a530 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1a540 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1a550 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1a560 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1a570 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1a580 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1a590 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65  );..}...login_re
1a5a0 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  t = cackey_login
1a5b0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
1a5c0 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c  lotID], pPin, ul
1a5d0 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f 72  PinLen, &tries_r
1a5e0 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69 66 20 28  emaining);..if (
1a5f0 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43  login_ret != CAC
1a600 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
1a610 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1a620 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1a630 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c  glock);....if (l
1a640 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
1a650 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
1a660 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1a670 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a680 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63  r.  Token is loc
1a690 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ked.");.....cack
1a6a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1a6b0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
1a6c0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
1a6d0 4b 45 44 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  KED;.....return(
1a6e0 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
1a6f0 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f  ...} else if (lo
1a700 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
1a710 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
1a720 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1a730 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a740 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22  .  Invalid PIN."
1a750 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
1a760 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
1a770 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
1a780 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
1a790 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  W;.....if (tries
1a7a0 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29  _remaining == 1)
1a7b0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c   {.....cackey_sl
1a7c0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
1a7d0 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
1a7e0 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52  SER_PIN_FINAL_TR
1a7f0 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75  Y;....}.....retu
1a800 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  rn(CKR_PIN_INCOR
1a810 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  RECT);...}....CA
1a820 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a830 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f  F("Error.  Unkno
1a840 77 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65  wn error returne
1a850 64 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f  d from cackey_lo
1a860 67 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67  gin() (%i)", log
1a870 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  in_ret);....retu
1a880 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1a890 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  RROR);..}...cack
1a8a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1a8b0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d 20  .token_flags &= 
1a8c0 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c  ~(CKF_USER_PIN_L
1a8d0 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45 52  OCKED | CKF_USER
1a8e0 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c  _PIN_COUNT_LOW |
1a8f0 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
1a900 52 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50  RED | CKF_USER_P
1a910 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a  IN_FINAL_TRY);..
1a920 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1a930 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
1a940 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f 46   = CKS_RO_USER_F
1a950 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65  UNCTIONS;...mute
1a960 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1a970 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1a980 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1a990 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1a9a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1a9b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a9c0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1a9d0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1a9e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1a9f0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1aa00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1aa10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1aa20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1aa30 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1aa40 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1aa50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1aa60 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28  K_RV, C_Logout)(
1aa70 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1aa80 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
1aa90 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1aaa0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1aab0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1aac0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1aad0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1aae0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1aaf0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ab00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ab10 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1ab20 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1ab30 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1ab40 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1ab50 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1ab60 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1ab70 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1ab80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1ab90 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1aba0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1abb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1abc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1abd0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1abe0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1abf0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1ac00 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1ac10 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1ac20 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1ac30 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1ac40 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1ac50 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1ac60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ac70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ac80 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1ac90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1aca0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1acb0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1acc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1acd0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
1ace0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1acf0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1ad00 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1ad10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ad20 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
1ad30 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1ad40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1ad50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1ad60 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ALID);..}...slot
1ad70 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
1ad80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1ad90 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
1ada0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1adb0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1adc0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1add0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ade0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1adf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ae00 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1ae10 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1ae20 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1ae30 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1ae40 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1ae50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1ae60 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
1ae70 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1ae80 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
1ae90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1aea0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1aeb0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1aec0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
1aed0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
1aee0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
1aef0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1af00 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1af10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1af20 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1af30 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61  _ERROR);..}...ca
1af40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1af50 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20  ession].state = 
1af60 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
1af70 53 53 49 4f 4e 3b 0a 09 63 61 63 6b 65 79 5f 73  SSION;..cackey_s
1af80 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1af90 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
1afa0 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a  OGIN_REQUIRED;..
1afb0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1afc0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1afd0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1afe0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1aff0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1b000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b010 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1b020 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1b030 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1b040 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1b050 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1b060 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1b070 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1b080 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1b090 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1b0a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1b0b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65  ION(CK_RV, C_Cre
1b0c0 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  ateObject)(CK_SE
1b0d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1b0e0 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
1b0f0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
1b100 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
1b110 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
1b120 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
1b130 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
1b140 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1b150 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1b160 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1b170 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b180 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b190 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1b1a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1b1b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1b1c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1b1d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1b1e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b1f0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1b200 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1b210 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1b220 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1b230 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1b240 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b250 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1b260 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1b270 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65  K_RV, C_CopyObje
1b280 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
1b290 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1b2a0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1b2b0 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
1b2c0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
1b2d0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
1b2e0 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
1b2f0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e  T_HANDLE_PTR phN
1b300 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  ewObject) {..CAC
1b310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b320 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1b330 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1b340 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1b350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b360 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1b370 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1b380 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1b390 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1b3a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1b3b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b3c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1b3d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1b3e0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1b3f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b400 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1b410 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1b420 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1b430 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1b440 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
1b450 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f  stroyObject)(CK_
1b460 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1b470 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1b480 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
1b490 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
1b4a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1b4b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1b4c0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1b4d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b4e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b4f0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1b500 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b510 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1b520 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1b530 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1b540 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1b550 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1b560 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1b570 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1b580 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1b590 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1b5a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1b5b0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1b5c0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1b5d0 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74  _RV, C_GetObject
1b5e0 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Size)(CK_SESSION
1b5f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1b600 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1b610 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  LE hObject, CK_U
1b620 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65  LONG_PTR pulSize
1b630 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1b640 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1b650 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1b660 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1b670 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b680 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b690 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1b6a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b6b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1b6c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1b6d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b6e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1b6f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1b700 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1b710 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1b720 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1b730 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1b740 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1b750 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1b760 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1b770 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75  RV, C_GetAttribu
1b780 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
1b790 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1b7a0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
1b7b0 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
1b7c0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
1b7d0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
1b7e0 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
1b7f0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
1b800 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74  rr_attr;..struct
1b810 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1b820 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73   *identity;..uns
1b830 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
1b840 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64  ity_idx, attr_id
1b850 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
1b860 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20  , num_ids;..int 
1b870 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43  mutex_retval;..C
1b880 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
1b890 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  R_OK;..CK_VOID_P
1b8a0 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55  TR pValue;..CK_U
1b8b0 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  LONG ulValueLen;
1b8c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b8d0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1b8e0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1b8f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1b900 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b910 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1b920 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1b930 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1b940 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1b950 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1b960 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1b970 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1b980 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1b990 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1b9a0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1b9b0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1b9c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b9d0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1b9e0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1b9f0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1ba00 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1ba10 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1ba20 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d  ..if (hObject ==
1ba30 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1ba40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ba50 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64  or.  Object hand
1ba60 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
1ba70 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1ba80 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
1ba90 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1baa0 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20  .if (ulCount == 
1bab0 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
1bac0 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f  circuit, if zero
1bad0 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70   objects were sp
1bae0 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a  ecified return z
1baf0 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69  ero items immedi
1bb00 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45  ately */...CACKE
1bb10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bb20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1bb30 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
1bb40 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
1bb50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1bb60 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  K);..}...if (pTe
1bb70 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  mplate == NULL) 
1bb80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1bb90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1bba0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55   pTemplate is NU
1bbb0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1bbc0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1bbd0 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69  AD);..}...identi
1bbe0 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74  ty_idx = hObject
1bbf0 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   - 1;...mutex_re
1bc00 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1bc10 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1bc20 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1bc30 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1bc40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1bc50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1bc60 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1bc70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1bc80 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1bc90 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
1bca0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1bcb0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
1bcc0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1bcd0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1bce0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1bcf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bd00 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1bd10 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1bd20 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1bd30 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1bd40 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75  NVALID);..}...nu
1bd50 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73  m_ids = cackey_s
1bd60 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1bd70 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1bd80 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  nt;...if (identi
1bd90 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64  ty_idx >= num_id
1bda0 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  s) {...cackey_mu
1bdb0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1bdc0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1bdd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bde0 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
1bdf0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
1be00 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74   range.  identit
1be10 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d  y_idx = %lu, num
1be20 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75  _ids = %lu.", (u
1be30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
1be40 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73  entity_idx, (uns
1be50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f  igned long) num_
1be60 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ids);....return(
1be70 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
1be80 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1be90 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  .identity = &cac
1bea0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1beb0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1bec0 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b  s[identity_idx];
1bed0 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
1bee0 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
1bef0 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69   ulCount; attr_i
1bf00 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61  dx++) {...curr_a
1bf10 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65  ttr = &pTemplate
1bf20 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70  [attr_idx];....p
1bf30 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
1bf40 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
1bf50 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41  _LONG) -1;....CA
1bf60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bf70 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  F("Looking for a
1bf80 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78  ttribute 0x%08lx
1bf90 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20   (identity:%lu) 
1bfa0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1bfb0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
1bfc0 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  >type, (unsigned
1bfd0 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
1bfe0 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65  idx);....for (se
1bff0 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
1c000 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
1c010 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
1c020 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
1c030 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
1c040 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
1c050 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1c060 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20  _attr_idx].type 
1c070 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  == curr_attr->ty
1c080 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  pe) {.....CACKEY
1c090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1c0a0 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56  ... found it, pV
1c0b0 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c  alue = %p, ulVal
1c0c0 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64  ueLen = %lu", id
1c0d0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
1c0e0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1c0f0 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69  ].pValue, identi
1c100 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
1c110 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
1c120 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a  ValueLen);......
1c130 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65  ....pValue = ide
1c140 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
1c150 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
1c160 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56  .pValue;.....ulV
1c170 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69  alueLen = identi
1c180 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
1c190 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
1c1a0 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09  ValueLen;....}..
1c1b0 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61  .}....if (curr_a
1c1c0 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70  ttr->pValue && p
1c1d0 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28  Value) {....if (
1c1e0 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
1c1f0 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65  ueLen >= ulValue
1c200 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70  Len) {.....memcp
1c210 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  y(curr_attr->pVa
1c220 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56  lue, pValue, ulV
1c230 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65  alueLen);....} e
1c240 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75  lse {.....ulValu
1c250 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
1c260 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c   -1;......retval
1c270 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
1c280 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09  O_SMALL;....}...
1c290 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e  }....curr_attr->
1c2a0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
1c2b0 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75  alueLen;..}...mu
1c2c0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1c2d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1c2e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1c2f0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1c300 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1c310 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c320 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1c330 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1c340 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1c350 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1c360 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
1c370 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
1c380 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09  YPE_INVALID) {..
1c390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c3a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1c3b0 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
1c3c0 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22  PE_INVALID (%i)"
1c3d0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
1c3e0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
1c3f0 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  val == CKR_BUFFE
1c400 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
1c410 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c420 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1c430 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
1c440 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74  MALL (%i)", (int
1c450 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
1c460 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
1c470 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
1c480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c490 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1c4a0 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  OK (%i)", (int) 
1c4b0 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
1c4c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c4d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1c4e0 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
1c4f0 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
1c500 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
1c510 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1c520 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41  ON(CK_RV, C_SetA
1c530 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
1c540 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1c550 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
1c560 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
1c570 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
1c580 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
1c590 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
1c5a0 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
1c5b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1c5c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1c5d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1c5e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c5f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c600 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1c610 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1c620 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1c630 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1c640 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1c650 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1c660 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1c670 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1c680 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1c690 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1c6a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1c6b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1c6c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1c6d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1c6e0 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
1c6f0 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  tsInit)(CK_SESSI
1c700 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1c710 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
1c720 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
1c730 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
1c740 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
1c750 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74  slotID;..int mut
1c760 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1c770 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c780 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1c790 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1c7a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1c7b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c7c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1c7d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1c7e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1c7f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1c800 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
1c810 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1c820 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1c830 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1c840 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1c850 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1c860 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1c870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c880 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1c890 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1c8a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1c8b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1c8c0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1c8d0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1c8e0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1c8f0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1c900 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1c910 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1c920 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c930 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1c940 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1c950 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1c960 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1c970 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1c980 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1c990 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1c9a0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1c9b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1c9c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c9d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1c9e0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1c9f0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1ca00 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1ca10 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1ca20 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
1ca30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ca40 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
1ca50 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1ca60 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1ca70 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1ca80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ca90 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61  Error.  Search a
1caa0 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 22 29  lready active.")
1cab0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1cac0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
1cad0 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  VE);..}...slotID
1cae0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
1caf0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
1cb00 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
1cb10 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
1cb20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1cb30 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1cb40 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1cb50 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1cb60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1cb70 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1cb80 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1cb90 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
1cba0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
1cbb0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
1cbc0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1cbd0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1cbe0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1cbf0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
1cc00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cc10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1cc20 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1cc30 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
1cc40 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
1cc50 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
1cc60 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1cc70 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1cc80 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
1cc90 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1cca0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1ccb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1ccc0 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29  tID].slot_reset)
1ccd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1cce0 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c  G_PRINTF("The sl
1ccf0 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65  ot has been rese
1cd00 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20  t since we last 
1cd10 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74  looked for ident
1cd20 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e  ities -- rescann
1cd30 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61  ing");....if (ca
1cd40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1cd50 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1cd60 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
1cd70 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65  .cackey_free_ide
1cd80 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73  ntities(cackey_s
1cd90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1cda0 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61  ].identities, ca
1cdb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1cdc0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1cdd0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63  es_count);.....c
1cde0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1cdf0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1ce00 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63  ies = NULL;....c
1ce10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1ce20 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1ce30 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  ies_count = 0;..
1ce40 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  .}....if (cackey
1ce50 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
1ce60 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  abel != NULL) {.
1ce70 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
1ce80 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
1ce90 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  el);....cackey_s
1cea0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
1ceb0 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a  el = NULL;...}..
1cec0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
1ced0 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
1cee0 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  t = 0;...cackey_
1cef0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
1cf00 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
1cf10 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
1cf20 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1cf30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1cf40 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d  n].identities ==
1cf50 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
1cf60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1cf70 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
1cf80 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64  = cackey_read_id
1cf90 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79  entities(&cackey
1cfa0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
1cfb0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
1cfc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1cfd0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d  ities_count);..}
1cfe0 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
1cff0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66   != NULL) {...if
1d000 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
1d010 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  {....cackey_sess
1d020 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1d030 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
1d040 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09  t = ulCount;....
1d050 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d060 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1d070 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28  _query = malloc(
1d080 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  ulCount * sizeof
1d090 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a  (*pTemplate));..
1d0a0 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
1d0b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d0c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1d0d0 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43  , pTemplate, ulC
1d0e0 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
1d0f0 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 7d 20  Template));...} 
1d100 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79  else {....cackey
1d110 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d120 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1d130 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63  _count = 0;....c
1d140 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1d150 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1d160 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  query = NULL;...
1d170 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
1d180 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
1d190 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
1d1a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1d1b0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41  biglock);.....CA
1d1c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d1d0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
1d1e0 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69 65  h query specifie
1d1f0 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e  d as NULL, but n
1d200 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74  umber of query t
1d210 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69  erms not specifi
1d220 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09  ed as 0.");.....
1d230 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1d240 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a  ENTS_BAD);...}..
1d250 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1d260 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1d270 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
1d280 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73   0;...cackey_ses
1d290 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1d2a0 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e  search_query = N
1d2b0 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ULL;..}...cackey
1d2c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d2d0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
1d2e0 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73  e = 1;..cackey_s
1d2f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d300 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
1d310 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   = 0;...mutex_re
1d320 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1d330 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1d340 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1d350 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1d360 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1d370 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d380 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1d390 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1d3a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1d3b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1d3c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d3d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1d3e0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1d3f0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1d400 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1d410 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1d420 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29  , C_FindObjects)
1d430 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1d440 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1d450 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
1d460 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  R phObject, CK_U
1d470 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74  LONG ulMaxObject
1d480 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  Count, CK_ULONG_
1d490 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75  PTR pulObjectCou
1d4a0 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nt) {..struct ca
1d4b0 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63  ckey_identity *c
1d4c0 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52  urr_id;..CK_ATTR
1d4d0 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
1d4e0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72  ;..CK_ULONG curr
1d4f0 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75  _id_idx, curr_ou
1d500 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61  t_id_idx, curr_a
1d510 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
1d520 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e  tr_idx;..CK_ULON
1d530 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c  G matched_count,
1d540 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f   prev_matched_co
1d550 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  unt;..int mutex_
1d560 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1d570 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1d580 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1d590 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1d5a0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1d5b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d5c0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1d5d0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1d5e0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1d5f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1d600 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f  );..}...if (pulO
1d610 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55  bjectCount == NU
1d620 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1d630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d640 6f 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f  or.  pulObjectCo
1d650 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  unt is NULL.");.
1d660 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1d670 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1d680 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20  ...if (phObject 
1d690 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78  == NULL && ulMax
1d6a0 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30  ObjectCount == 0
1d6b0 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
1d6c0 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20  ircuit, if zero 
1d6d0 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65  objects were spe
1d6e0 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65  cified return ze
1d6f0 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61  ro items immedia
1d700 74 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62  tely */...*pulOb
1d710 6a 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a  jectCount = 0;..
1d720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d730 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1d740 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
1d750 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
1d760 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
1d770 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
1d780 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20  if (phObject == 
1d790 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1d7a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d7b0 72 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20  rror.  phObject 
1d7c0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1d7d0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1d7e0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1d7f0 66 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  f (ulMaxObjectCo
1d800 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  unt == 0) {...CA
1d810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d820 46 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d  F("Error.  Maxim
1d830 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  um number of obj
1d840 65 63 74 73 20 73 70 65 63 69 66 69 65 64 20 61  ects specified a
1d850 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65  s zero.");....re
1d860 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1d870 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1d880 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1d890 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1d8a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1d8b0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1d8c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1d8d0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1d8e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d8f0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1d900 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1d910 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1d920 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1d930 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1d940 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1d950 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1d960 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1d970 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1d980 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1d990 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d9a0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1d9b0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1d9c0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1d9d0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1d9e0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1d9f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1da00 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1da10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1da20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1da30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1da40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1da50 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1da60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1da70 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1da80 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1da90 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1daa0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1dab0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
1dac0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1dad0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1dae0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1daf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1db00 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
1db10 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  ch not active.")
1db20 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1db30 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
1db40 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1db50 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ...curr_out_id_i
1db60 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75  dx = 0;..for (cu
1db70 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b  rr_id_idx = cack
1db80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1db90 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
1dba0 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64  r_id; curr_id_id
1dbb0 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
1dbc0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
1dbd0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26  entities_count &
1dbe0 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  & ulMaxObjectCou
1dbf0 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b  nt; curr_id_idx+
1dc00 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d  +) {...curr_id =
1dc10 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
1dc20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1dc30 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69  tities[curr_id_i
1dc40 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  dx];....CACKEY_D
1dc50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f  EBUG_PRINTF("Pro
1dc60 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79  cessing identity
1dc70 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64  :%lu", (unsigned
1dc80 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69   long) curr_id_i
1dc90 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f  dx);....matched_
1dca0 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f  count = 0;....fo
1dcb0 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78  r (curr_attr_idx
1dcc0 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f   = 0; curr_attr_
1dcd0 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
1dce0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1dcf0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
1dd00 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64  nt; curr_attr_id
1dd10 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d  x++) {....prev_m
1dd20 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d  atched_count = m
1dd30 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09  atched_count;...
1dd40 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63  ..curr_attr = &c
1dd50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1dd60 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1dd70 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f  query[curr_attr_
1dd80 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59  idx];.....CACKEY
1dd90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1dda0 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74   Checking for at
1ddb0 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78 20  tribute 0x%08lx 
1ddc0 69 6e 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e  in identity:%i..
1ddd0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1dde0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74  ng) curr_attr->t
1ddf0 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  ype, (int) curr_
1de00 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b  id_idx);....CACK
1de10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
1de20 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f  F("    Value loo
1de30 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72  king for:", curr
1de40 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
1de50 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
1de60 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28  eLen);.....for (
1de70 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20  sess_attr_idx = 
1de80 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  0; sess_attr_idx
1de90 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72   < curr_id->attr
1dea0 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65  ibutes_count; se
1deb0 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  ss_attr_idx++) {
1dec0 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 69 64  .....if (curr_id
1ded0 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
1dee0 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65  s_attr_idx].type
1def0 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74   == curr_attr->t
1df00 79 70 65 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ype) {......CACK
1df10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1df20 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d  "    ... found m
1df30 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e  atching type ...
1df40 22 29 3b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ");......CACKEY_
1df50 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
1df60 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75      ... our valu
1df70 65 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74  e:", curr_id->at
1df80 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1df90 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  tr_idx].pValue, 
1dfa0 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
1dfb0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
1dfc0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
1dfd0 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 61  ......if (curr_a
1dfe0 74 74 72 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e  ttr->pValue == N
1dff0 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ULL) {.......CAC
1e000 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e010 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
1e020 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63  nd wildcard matc
1e030 68 22 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63  h");........matc
1e040 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09  hed_count++;....
1e050 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
1e060 7d 0a 0a 20 09 09 09 09 09 69 66 20 28 63 75 72  }.. .....if (cur
1e070 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
1e080 65 6e 20 3d 3d 20 63 75 72 72 5f 69 64 2d 3e 61  en == curr_id->a
1e090 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
1e0a0 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
1e0b0 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 63 75  Len && memcmp(cu
1e0c0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
1e0d0 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
1e0e0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
1e0f0 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72  dx].pValue, curr
1e100 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
1e110 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
1e120 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29  lValueLen) == 0)
1e130 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
1e140 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
1e150 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65       ... found e
1e160 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09  xact match");...
1e170 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75  .....matched_cou
1e180 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65  nt++;........bre
1e190 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ak;......}.....}
1e1a0 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20  ....}...../* If 
1e1b0 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63 6f  the attribute co
1e1c0 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68  uld not be match
1e1d0 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74  ed, do not try t
1e1e0 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e  o match addition
1e1f0 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f  al attributes */
1e200 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74  ....if (prev_mat
1e210 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61  ched_count == ma
1e220 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09  tched_count) {..
1e230 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09  ...break;....}..
1e240 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65  .}....if (matche
1e250 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65  d_count == cacke
1e260 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e270 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1e280 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41  y_count) {....CA
1e290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e2a0 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20  F("  ... All %i 
1e2b0 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
1e2c0 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64  ed for found, ad
1e2d0 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69  ding identity:%i
1e2e0 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73   to returned lis
1e2f0 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  t", (int) cackey
1e300 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1e310 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1e320 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
1e330 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09  rr_id_idx);.....
1e340 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75  phObject[curr_ou
1e350 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72  t_id_idx] = curr
1e360 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09  _id_idx + 1;....
1e370 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  .ulMaxObjectCoun
1e380 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75  t--;.....curr_ou
1e390 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20  t_id_idx++;...} 
1e3a0 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
1e3b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1e3c0 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20   ... Not all %i 
1e3d0 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20  (only found %i) 
1e3e0 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
1e3f0 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f  ed for found, no
1e400 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  t adding identit
1e410 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63  y:%i", (int) cac
1e420 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1e430 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1e440 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  ery_count, (int)
1e450 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20   matched_count, 
1e460 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
1e470 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b  x);...}..}..cack
1e480 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1e490 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
1e4a0 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69  r_id = curr_id_i
1e4b0 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43  dx;..*pulObjectC
1e4c0 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f  ount = curr_out_
1e4d0 69 64 5f 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f  id_idx;...mutex_
1e4e0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1e4f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1e500 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1e510 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1e520 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1e530 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e540 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1e550 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1e560 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1e570 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1e580 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e590 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1e5a0 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f  R_OK (%i), num o
1e5b0 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43  bjects = %lu", C
1e5c0 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63  KR_OK, *pulObjec
1e5d0 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72  tCount);...retur
1e5e0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1e5f0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1e600 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
1e610 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53  jectsFinal)(CK_S
1e620 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1e630 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d  ession) {..int m
1e640 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
1e650 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e660 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1e670 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1e680 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1e690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e6a0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1e6b0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1e6c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1e6d0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1e6e0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1e6f0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
1e700 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
1e710 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1e720 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1e730 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1e740 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1e750 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e760 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
1e770 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
1e780 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1e790 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1e7a0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1e7b0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1e7c0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1e7d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1e7e0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1e7f0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1e800 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e810 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1e820 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1e830 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1e840 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1e850 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1e860 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1e870 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1e880 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e890 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1e8a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e8b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1e8c0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1e8d0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1e8e0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1e8f0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1e900 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1e910 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1e920 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
1e930 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1e940 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1e950 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1e960 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e970 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
1e980 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  h not active.");
1e990 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1e9a0 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
1e9b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1e9c0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1e9d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1e9e0 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  ch_active = 0;..
1e9f0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1ea00 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1ea10 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09  arch_query) {...
1ea20 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
1ea30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1ea40 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d  earch_query);..}
1ea50 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1ea60 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1ea70 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1ea80 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1ea90 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1eaa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1eab0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1eac0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1ead0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1eae0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1eaf0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1eb00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1eb10 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1eb20 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1eb30 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1eb40 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1eb50 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
1eb60 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ncryptInit)(CK_S
1eb70 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1eb80 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
1eb90 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
1eba0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
1ebb0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
1ebc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ebd0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1ebe0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1ebf0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1ec00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ec10 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1ec20 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1ec30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1ec40 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1ec50 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1ec60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ec70 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1ec80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1ec90 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1eca0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1ecb0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1ecc0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1ecd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1ece0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1ecf0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1ed00 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Encrypt)(CK_SESS
1ed10 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1ed20 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1ed30 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
1ed40 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
1ed50 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
1ed60 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  edData, CK_ULONG
1ed70 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
1ed80 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  dDataLen) {..CAC
1ed90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1eda0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1edb0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1edc0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1edd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ede0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1edf0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1ee00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1ee10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1ee20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1ee30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ee40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1ee50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ee60 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1ee70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1ee80 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1ee90 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1eea0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1eeb0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1eec0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
1eed0 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
1eee0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1eef0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1ef00 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
1ef10 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
1ef20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
1ef30 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
1ef40 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
1ef50 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
1ef60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ef70 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1ef80 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1ef90 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1efa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1efb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1efc0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1efd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1efe0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1eff0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1f000 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f010 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1f020 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1f030 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1f040 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1f050 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1f060 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1f070 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f080 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1f090 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f0a0 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28  C_EncryptFinal)(
1f0b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1f0c0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1f0d0 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63  YTE_PTR pLastEnc
1f0e0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
1f0f0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
1f100 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
1f110 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1f120 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1f130 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1f140 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1f150 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f160 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f170 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1f180 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f190 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1f1a0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1f1b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f1c0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1f1d0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1f1e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1f1f0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1f200 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1f210 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1f220 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1f230 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1f240 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1f250 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69  RV, C_DecryptIni
1f260 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1f270 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1f280 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
1f290 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
1f2a0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
1f2b0 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  y) {..int mutex_
1f2c0 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d  retval;...hKey--
1f2d0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1f2e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1f2f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1f300 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f310 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f320 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f330 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f340 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f350 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f360 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f370 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
1f380 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1f390 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f3a0 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
1f3b0 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  nism is NULL.");
1f3c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1f3d0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1f3e0 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
1f3f0 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
1f400 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b   CKM_RSA_PKCS) {
1f410 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f420 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1f430 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
1f440 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69  nism not specifi
1f450 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b  ed as CKM_RSA_PK
1f460 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  CS");....return(
1f470 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41  CKR_MECHANISM_PA
1f480 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  RAM_INVALID);..}
1f490 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1f4a0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1f4b0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1f4c0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1f4d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1f4e0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1f4f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f500 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1f510 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1f520 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1f530 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1f540 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1f550 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1f560 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1f570 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f580 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1f590 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1f5a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f5b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1f5c0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1f5d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f5e0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1f5f0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1f600 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1f610 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1f620 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1f630 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1f640 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1f650 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f660 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1f670 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1f680 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1f690 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1f6a0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
1f6b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1f6c0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1f6d0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1f6e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1f6f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1f700 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1f710 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f720 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79   Decrypt already
1f730 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
1f740 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1f750 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
1f760 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
1f770 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
1f780 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1f790 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1f7a0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1f7b0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1f7c0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1f7d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f7e0 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
1f7f0 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
1f800 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79  e (requested key
1f810 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69   %lu, only %lu i
1f820 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61  dentities availa
1f830 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ble).", (unsigne
1f840 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75  d long) hKey, (u
1f850 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
1f860 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1f870 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1f880 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  es_count);....re
1f890 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
1f8a0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1f8b0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1f8c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
1f8d0 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b  rypt_active = 1;
1f8e0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1f8f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
1f900 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  rypt_mechanism =
1f910 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
1f920 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f  hanism;..cackey_
1f930 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f940 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
1f950 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  parm = pMechanis
1f960 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09  m->pParameter;..
1f970 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f980 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
1f990 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d  t_mech_parmlen =
1f9a0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50   pMechanism->ulP
1f9b0 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61  arameterLen;..ca
1f9c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1f9d0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1f9e0 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
1f9f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1fa00 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1fa10 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
1fa20 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1fa30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1fa40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1fa50 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1fa60 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1fa70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1fa80 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1fa90 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1faa0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1fab0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1fac0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fad0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1fae0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1faf0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1fb00 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1fb10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1fb20 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43  RV, C_Decrypt)(C
1fb30 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1fb40 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1fb50 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
1fb60 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dData, CK_ULONG 
1fb70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
1fb80 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
1fb90 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
1fba0 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
1fbb0 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61  {..CK_ULONG data
1fbc0 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61  len_update, data
1fbd0 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52  len_final;..CK_R
1fbe0 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a  V decrypt_ret;..
1fbf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fc00 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1fc10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1fc20 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1fc30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fc40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1fc50 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1fc60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1fc70 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1fc80 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1fc90 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d  f (pulDataLen ==
1fca0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1fcb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fcc0 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65  Error. pulDataLe
1fcd0 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
1fce0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1fcf0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1fd00 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20  .datalen_update 
1fd10 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a  = *pulDataLen;..
1fd20 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
1fd30 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68  _DecryptUpdate(h
1fd40 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70  Session, pEncryp
1fd50 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79  tedData, ulEncry
1fd60 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61  ptedDataLen, pDa
1fd70 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64  ta, &datalen_upd
1fd80 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79  ate);..if (decry
1fd90 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
1fda0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fdb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1fdc0 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65  .  DecryptUpdate
1fdd0 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
1fde0 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
1fdf0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1fe00 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
1fe10 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
1fe20 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  t_ret);..}...if 
1fe30 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74  (pData) {...pDat
1fe40 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64  a += datalen_upd
1fe50 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e  ate;..}..datalen
1fe60 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74  _final = *pulDat
1fe70 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75  aLen - datalen_u
1fe80 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74  pdate;...decrypt
1fe90 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74  _ret = C_Decrypt
1fea0 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
1feb0 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
1fec0 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63  final);..if (dec
1fed0 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
1fee0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
1fef0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ff00 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61  or.  DecryptFina
1ff10 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
1ff20 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
1ff30 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1ff40 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b  g) decrypt_ret);
1ff50 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
1ff60 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70  pt_ret);..}...*p
1ff70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61  ulDataLen = data
1ff80 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74  len_update + dat
1ff90 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41  alen_final;...CA
1ffa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ffb0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1ffc0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1ffd0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1ffe0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1fff0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
20000 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61  V, C_DecryptUpda
20010 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
20020 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
20030 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
20040 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
20050 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
20060 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
20070 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
20080 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
20090 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
200a0 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34  K_BYTE buf[16384
200b0 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c  ];..ssize_t bufl
200c0 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  en;..CK_SLOT_ID 
200d0 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72  slotID;..CK_RV r
200e0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45  etval = CKR_GENE
200f0 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20  RAL_ERROR;..int 
20100 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
20110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20120 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20130 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
20140 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
20150 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20160 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
20170 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
20180 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
20190 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
201a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
201b0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
201c0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
201d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
201e0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
201f0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
20200 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
20210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20220 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
20230 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
20240 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
20250 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
20260 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
20270 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72  f (pEncryptedPar
20280 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45  t == NULL && ulE
20290 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
202a0 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
202b0 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65  rt circuit if we
202c0 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65   are asked to de
202d0 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e  crypt nothing...
202e0 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
202f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20300 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
20310 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
20320 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
20330 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
20340 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74  }...if (pEncrypt
20350 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  edPart == NULL) 
20360 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20370 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20380 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69  pEncryptedPart i
20390 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e  s NULL, but ulEn
203a0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69  cryptedPartLen i
203b0 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72  s not 0.");....r
203c0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
203d0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
203e0 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61  f (ulEncryptedPa
203f0 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
20400 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20410 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e  NTF("Error. ulEn
20420 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69  cryptedPartLen i
20430 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69  s 0, but pPart i
20440 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
20450 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
20460 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
20470 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e  ..if (pulPartLen
20480 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
20490 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
204a0 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72  F("Error. pulPar
204b0 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  tLen is NULL.");
204c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
204d0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
204e0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
204f0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
20500 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20510 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
20520 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20540 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
20550 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20560 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20570 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20580 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
20590 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
205a0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
205b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
205c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
205d0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
205e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
205f0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
20600 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
20610 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
20620 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
20630 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
20640 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20650 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
20660 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
20670 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
20680 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
20690 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
206a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
206b0 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
206c0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
206d0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
206e0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
206f0 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
20700 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
20710 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
20720 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
20730 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
20740 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
20750 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
20760 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
20770 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
20780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20790 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
207a0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
207b0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
207c0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
207d0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
207e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
207f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
20800 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
20810 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
20820 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20830 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
20840 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
20850 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
20860 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
20870 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
20880 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
20890 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
208a0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
208b0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
208c0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
208d0 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
208e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
208f0 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29  crypt_mechanism)
20900 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
20910 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73  A_PKCS:..../* As
20920 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70  k card to decryp
20930 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d  t */....buflen =
20940 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
20950 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
20960 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
20970 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20980 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
20990 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65  ntity, pEncrypte
209a0 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74  dPart, ulEncrypt
209b0 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20  edPartLen, buf, 
209c0 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20  sizeof(buf), 0, 
209d0 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c  1);.....if (bufl
209e0 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a  en < 0) {...../*
209f0 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c   Decryption fail
20a00 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62  ed. */.....if (b
20a10 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
20a20 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
20a30 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
20a40 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c  = CKR_USER_NOT_L
20a50 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20  OGGED_IN;.....} 
20a60 65 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20  else if (buflen 
20a70 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
20a80 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
20a90 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
20aa0 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
20ab0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
20ac0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
20ad0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
20ae0 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
20af0 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
20b00 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a  ong) buflen) > *
20b10 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50  pulPartLen && pP
20b20 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65  art) {...../* De
20b30 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f  crypted data too
20b40 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65   large */.....re
20b50 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
20b60 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
20b70 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20  } else {.....if 
20b80 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d  (pPart) {......m
20b90 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66  emcpy(pPart, buf
20ba0 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d  , buflen);.....}
20bb0 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65  ......*pulPartLe
20bc0 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09  n = buflen;.....
20bd0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b  .retval = CKR_OK
20be0 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b  ;....}.....break
20bf0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
20c00 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
20c10 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
20c20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20c30 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
20c40 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
20c50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20c60 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
20c70 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
20c80 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
20c90 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
20ca0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20cb0 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
20cc0 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a  (int) retval);..
20cd0 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
20ce0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
20cf0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
20d00 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  DecryptFinal)(CK
20d10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
20d20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
20d30 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c  E_PTR pLastPart,
20d40 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
20d50 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a  lLastPartLen) {.
20d60 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
20d70 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  l;..int terminat
20d80 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a  e_decrypt = 1;..
20d90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20da0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20db0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20dc0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20dd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20de0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20df0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20e00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20e10 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20e20 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
20e30 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
20e40 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
20e50 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
20e60 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
20e70 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
20e80 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
20e90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20ea0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
20eb0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
20ec0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
20ed0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
20ee0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
20ef0 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c  if (pulLastPartL
20f00 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
20f10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20f20 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c  NTF("Error. pulL
20f30 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55  astPartLen is NU
20f40 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
20f50 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
20f60 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
20f70 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20f80 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
20f90 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
20fa0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
20fb0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20fc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20fd0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
20fe0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20ff0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21000 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
21010 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21020 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
21030 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
21040 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
21050 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
21060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21070 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
21080 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
21090 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
210a0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
210b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
210c0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
210d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
210e0 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
210f0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21100 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21110 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
21120 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21130 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
21140 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
21150 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
21160 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
21170 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
21180 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  *pulLastPartLen 
21190 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74  = 0;...if (pLast
211a0 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
211b0 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72  ..terminate_decr
211c0 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ypt = 0;..}...if
211d0 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72   (terminate_decr
211e0 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ypt) {...cackey_
211f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21200 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
21210 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65  e = 0;..}...mute
21220 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21230 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21240 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21250 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
21260 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
21270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21280 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
21290 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
212a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
212b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
212c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
212d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
212e0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
212f0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
21300 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
21310 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
21320 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e  K_RV, C_DigestIn
21330 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
21340 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
21350 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
21360 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09   pMechanism) {..
21370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21380 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21390 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
213a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
213b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
213c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
213d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
213e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
213f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21400 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
21410 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21420 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21430 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21440 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
21450 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21460 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
21470 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
21480 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21490 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
214a0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
214b0 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53  _Digest)(CK_SESS
214c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
214d0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
214e0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
214f0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
21500 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
21510 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
21520 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
21530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21540 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
21550 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
21560 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
21570 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21580 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
21590 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
215a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
215b0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
215c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
215d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
215e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
215f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21600 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
21610 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
21620 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
21630 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
21640 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
21650 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
21660 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
21670 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b  DigestUpdate)(CK
21680 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
21690 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
216a0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
216b0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
216c0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
216d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
216e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
216f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
21700 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21710 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21720 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
21730 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21740 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
21750 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
21760 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21770 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
21780 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
21790 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
217a0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
217b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
217c0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
217d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
217e0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
217f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
21800 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28  V, C_DigestKey)(
21810 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
21820 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
21830 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
21840 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
21850 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
21860 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
21870 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
21880 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21890 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
218a0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
218b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
218c0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
218d0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
218e0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
218f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
21900 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
21910 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
21920 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
21930 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21940 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
21950 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21960 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
21970 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
21980 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e  _RV, C_DigestFin
21990 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
219a0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
219b0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67  CK_BYTE_PTR pDig
219c0 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  est, CK_ULONG_PT
219d0 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20  R pulDigestLen) 
219e0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
219f0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21a00 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
21a10 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
21a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21a30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21a40 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21a50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21a60 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21a70 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21a80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21a90 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21aa0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21ab0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
21ac0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
21ad0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
21ae0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
21af0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21b00 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
21b10 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21b20 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b  , C_SignInit)(CK
21b30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
21b40 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
21b50 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
21b60 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
21b70 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
21b80 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
21b90 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43  l;...hKey--;...C
21ba0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21bb0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
21bc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
21bd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
21be0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21bf0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
21c00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
21c10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
21c20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
21c30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
21c40 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e  (pMechanism == N
21c50 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
21c60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21c70 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20  ror. pMechanism 
21c80 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
21c90 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
21ca0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
21cb0 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  f (pMechanism->m
21cc0 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
21cd0 52 53 41 5f 50 4b 43 53 20 26 26 20 70 4d 65 63  RSA_PKCS && pMec
21ce0 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
21cf0 6d 20 21 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53  m != CKM_SHA1_RS
21d00 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b  A_PKCS) {...CACK
21d10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21d20 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
21d30 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f  sm->mechanism no
21d40 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43  t specified as C
21d50 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 6f 72 20 43  KM_RSA_PKCS or C
21d60 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
21d70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21d80 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41  R_MECHANISM_PARA
21d90 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  M_INVALID);..}..
21da0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
21db0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
21dc0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
21dd0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
21de0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
21df0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
21e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21e10 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
21e20 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
21e30 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
21e40 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
21e50 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
21e60 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
21e70 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
21e80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21e90 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
21ea0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
21eb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21ec0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
21ed0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
21ee0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
21ef0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
21f00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
21f10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21f20 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
21f30 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
21f40 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
21f50 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
21f60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21f70 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
21f80 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
21f90 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
21fa0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
21fb0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
21fc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21fd0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
21fe0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
21ff0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
22000 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
22010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22020 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
22030 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67   already in prog
22040 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ress.");......re
22050 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
22060 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
22070 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63  .if (hKey >= cac
22080 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22090 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
220a0 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63  s_count) {...cac
220b0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
220c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
220d0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
220e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
220f0 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74    Key handle out
22100 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65   of range (reque
22110 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e  sted key %lu, on
22120 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65  ly %lu identitie
22130 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20  s available).", 
22140 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
22150 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  hKey, (unsigned 
22160 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73  long) cackey_ses
22170 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
22180 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
22190 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
221a0 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  _KEY_HANDLE_INVA
221b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  LID);..}...cacke
221c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
221d0 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
221e0 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
221f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22200 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
22210 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d   = pMechanism->m
22220 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b  echanism;...cack
22230 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22240 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
22250 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79  n = 128;..cackey
22260 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22270 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
22280 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65   = 0;..cackey_se
22290 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
222a0 2e 73 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c  .sign_buf = mall
222b0 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65  oc(sizeof(*cacke
222c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
222d0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a  ion].sign_buf) *
222e0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
222f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
22300 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45  buflen);...CACKE
22310 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22320 53 65 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e  Session %lu sign
22330 5f 69 64 65 6e 74 69 74 79 20 69 73 20 25 70 20  _identity is %p 
22340 28 69 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22  (identity #%lu)"
22350 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
22360 29 20 68 53 65 73 73 69 6f 6e 2c 20 26 63 61 63  ) hSession, &cac
22370 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22380 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
22390 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e  s[hKey], (unsign
223a0 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a  ed long) hKey);.
223b0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
223c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
223d0 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
223e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
223f0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
22400 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
22410 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
22420 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22430 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
22440 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
22450 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
22460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22470 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
22480 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
22490 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
224a0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
224b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
224c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
224d0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
224e0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
224f0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
22500 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22510 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53  RV, C_Sign)(CK_S
22520 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
22530 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
22540 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
22550 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
22560 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
22570 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
22580 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
22590 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  Len) {..unsigned
225a0 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e   long start_sign
225b0 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56  _bufused;..CK_RV
225c0 20 73 69 67 6e 5f 72 65 74 3b 0a 0a 09 43 41 43   sign_ret;...CAC
225d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
225e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
225f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
22600 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
22610 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22620 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
22630 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
22640 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
22650 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
22660 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
22670 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
22680 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
22690 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
226a0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
226b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
226c0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
226d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
226e0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
226f0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
22700 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
22710 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
22720 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72  ALID);..}...star
22730 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  t_sign_bufused =
22740 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
22750 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
22760 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f  bufused;...sign_
22770 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ret = C_SignUpda
22780 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  te(hSession, pDa
22790 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a  ta, ulDataLen);.
227a0 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d  .if (sign_ret !=
227b0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
227c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
227d0 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70  ("Error.  SignUp
227e0 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20  date() returned 
227f0 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
22800 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
22810 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
22820 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
22830 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f  ret);..}...sign_
22840 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  ret = C_SignFina
22850 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67  l(hSession, pSig
22860 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61  nature, pulSigna
22870 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73  tureLen);..if (s
22880 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
22890 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f  K) {...if (sign_
228a0 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  ret == CKR_BUFFE
228b0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
228c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
228d0 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c  RINTF("SignFinal
228e0 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f  () returned CKR_
228f0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
22900 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64   (rv = %lu), und
22910 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74  oing C_SignUpdat
22920 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e()", (unsigned 
22930 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
22940 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
22950 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22960 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74  ign_bufused = st
22970 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
22980 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67  ;.....return(sig
22990 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43  n_ret);...}....C
229a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
229b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
229c0 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64  Final() returned
229d0 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
229e0 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
229f0 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
22a00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  ;....return(sign
22a10 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  _ret);..}...CACK
22a20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22a30 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
22a40 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
22a50 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
22a60 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
22a70 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22a80 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43   C_SignUpdate)(C
22a90 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22aa0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
22ab0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
22ac0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
22ad0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
22ae0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
22af0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
22b00 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
22b10 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22b20 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
22b30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22b40 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
22b50 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
22b60 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
22b70 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
22b80 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
22b90 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
22ba0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
22bb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
22bc0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
22bd0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
22be0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22bf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22c00 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
22c10 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
22c20 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
22c30 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
22c40 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72  );..}...if (pPar
22c50 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50  t == NULL && ulP
22c60 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
22c70 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
22c80 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65  t if we are aske
22c90 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e  d to sign nothin
22ca0 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59  g... */...CACKEY
22cb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22cc0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
22cd0 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
22ce0 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
22cf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
22d00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72  );..}...if (pPar
22d10 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
22d20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22d30 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74  TF("Error. pPart
22d40 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
22d50 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30  PartLen is not 0
22d60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22d70 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
22d80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61  );..}...if (ulPa
22d90 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
22da0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22db0 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61  NTF("Error. ulPa
22dc0 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20  rtLen is 0, but 
22dd0 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  pPart is not NUL
22de0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
22df0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
22e00 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
22e10 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
22e20 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
22e30 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
22e40 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
22e50 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
22e60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22e70 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
22e80 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22e90 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
22ea0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
22eb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22ec0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
22ed0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
22ee0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
22ef0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
22f00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22f10 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
22f20 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
22f30 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
22f40 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
22f50 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
22f60 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
22f70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
22f80 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
22f90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
22fa0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
22fb0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
22fc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22fd0 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
22fe0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
22ff0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
23000 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
23010 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  D);..}...switch 
23020 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
23030 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
23040 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
23050 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
23060 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61  :..../* Accumula
23070 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09  te directly */..
23080 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65  ..if ((cackey_se
23090 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
230a0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20  .sign_bufused + 
230b0 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63  ulPartLen) > cac
230c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
230d0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
230e0 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  en) {.....cackey
230f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23100 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
23110 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65  *= 2;......cacke
23120 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23130 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20  ion].sign_buf = 
23140 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73  realloc(cackey_s
23150 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23160 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65  ].sign_buf, size
23170 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
23180 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
23190 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
231a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
231b0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
231c0 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70  ;....}.....memcp
231d0 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  y(cackey_session
231e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
231f0 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65  _buf + cackey_se
23200 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23210 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70  .sign_bufused, p
23220 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29  Part, ulPartLen)
23230 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
23240 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23250 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20  sign_bufused += 
23260 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62  ulPartLen;.....b
23270 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d  reak;...case CKM
23280 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a  _SHA1_RSA_PKCS:.
23290 09 09 09 2f 2a 20 58 58 58 3a 20 41 63 63 75 6d  .../* XXX: Accum
232a0 75 6c 61 74 65 20 69 6e 74 6f 20 61 20 53 48 41  ulate into a SHA
232b0 31 20 68 61 73 68 20 2a 2f 0a 09 09 09 63 61 63  1 hash */....cac
232c0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
232d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
232e0 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
232f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23300 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
23310 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
23320 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
23330 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23340 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  D);.....return(C
23350 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23360 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 09 09 62  SUPPORTED);....b
23370 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  reak;..}...mutex
23380 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
23390 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
233a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
233b0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
233c0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
233d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
233e0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
233f0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
23400 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
23410 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
23420 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23430 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23440 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
23450 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
23460 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
23470 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
23480 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c  _RV, C_SignFinal
23490 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
234a0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
234b0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
234c0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
234d0 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
234e0 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
234f0 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31 30 32  _BYTE sigbuf[102
23500 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67  4];..ssize_t sig
23510 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54  buflen;..CK_SLOT
23520 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
23530 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  RV retval = CKR_
23540 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
23550 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69  int terminate_si
23560 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  gn = 1;..int mut
23570 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
23580 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23590 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
235a0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
235b0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
235c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
235d0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
235e0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
235f0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
23600 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
23610 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
23620 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
23630 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
23640 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23650 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61  "Error. pulSigna
23660 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  tureLen is NULL.
23670 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23680 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
23690 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
236a0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
236b0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
236c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
236d0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
236e0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
236f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23700 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23710 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
23720 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
23730 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
23740 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
23750 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
23760 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
23770 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
23780 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
23790 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
237a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
237b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
237c0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
237d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
237e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
237f0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
23800 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23810 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
23820 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
23830 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23840 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
23850 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23860 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
23870 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
23880 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
23890 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
238a0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
238b0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
238c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
238d0 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
238e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
238f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
23900 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
23910 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23920 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
23930 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
23940 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
23950 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23960 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
23970 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
23980 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
23990 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
239a0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
239b0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
239c0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
239d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
239e0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
239f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23a00 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
23a10 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
23a20 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
23a30 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
23a40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23a50 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
23a60 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
23a70 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
23a80 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
23a90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23aa0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
23ab0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
23ac0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
23ad0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
23ae0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
23af0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
23b00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
23b10 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
23b20 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23b30 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
23b40 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
23b50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
23b60 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
23b70 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
23b80 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72  S:..../* Ask car
23b90 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09  d to sign */....
23ba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23bb0 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73  NTF("Asking to s
23bc0 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74  ign from identit
23bd0 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20  y %p in session 
23be0 25 6c 75 22 2c 20 63 61 63 6b 65 79 5f 73 65 73  %lu", cackey_ses
23bf0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23c00 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28  sign_identity, (
23c10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
23c20 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67  Session);....sig
23c30 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
23c40 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
23c50 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
23c60 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ], cackey_sessio
23c70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
23c80 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b  n_identity, cack
23c90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23ca0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20  sion].sign_buf, 
23cb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23cc0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
23cd0 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20  ufused, sigbuf, 
23ce0 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20  sizeof(sigbuf), 
23cf0 31 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73  1, 0);.....if (s
23d00 69 67 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a  igbuflen < 0) {.
23d10 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66  ..../* Signing f
23d20 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66  ailed. */.....if
23d30 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43   (sigbuflen == C
23d40 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
23d50 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72  DLOGIN) {......r
23d60 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52  etval = CKR_USER
23d70 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a  _NOT_LOGGED_IN;.
23d80 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73  ....} else if (s
23d90 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b  igbuflen == CACK
23da0 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
23db0 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65  BSENT) {......re
23dc0 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43  tval = CKR_DEVIC
23dd0 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d  E_REMOVED;.....}
23de0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74   else {......ret
23df0 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
23e00 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09  L_ERROR;.....}..
23e10 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75  ..} else if (((u
23e20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
23e30 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53  gbuflen) > *pulS
23e40 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 26 20 70  ignatureLen && p
23e50 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09  Signature) {....
23e60 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 74 61 20  ./* Signed data 
23e70 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09  too large */....
23e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23e90 49 4e 54 46 28 22 72 65 74 76 61 6c 20 3d 20 43  INTF("retval = C
23ea0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
23eb0 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c 65 6e 20  ALL;  sigbuflen 
23ec0 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74  = %lu, pulSignat
23ed0 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28  ureLen = %lu", (
23ee0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
23ef0 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67  igbuflen, (unsig
23f00 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69  ned long) *pulSi
23f10 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09  gnatureLen);....
23f20 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
23f30 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
23f40 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f  ......terminate_
23f50 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65  sign = 0;....} e
23f60 6c 73 65 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e  lse {.....termin
23f70 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09  ate_sign = 0;...
23f80 09 09 09 69 66 20 28 70 53 69 67 6e 61 74 75 72  ...if (pSignatur
23f90 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79  e) {......memcpy
23fa0 28 70 53 69 67 6e 61 74 75 72 65 2c 20 73 69 67  (pSignature, sig
23fb0 62 75 66 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b  buf, sigbuflen);
23fc0 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e 61 74 65  .......terminate
23fd0 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d  _sign = 1;.....}
23fe0 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67 6e 61 74  ......*pulSignat
23ff0 75 72 65 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c  ureLen = sigbufl
24000 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  en;......retval 
24010 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a  = CKR_OK;....}..
24020 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
24030 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b   CKM_SHA1_RSA_PK
24040 43 53 3a 0a 09 09 09 2f 2a 20 58 58 58 3a 20 41  CS:..../* XXX: A
24050 63 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f 20 61  ccumulate into a
24060 20 53 48 41 31 20 68 61 73 68 20 2a 2f 0a 09 09   SHA1 hash */...
24070 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
24080 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
24090 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  ock);.....CACKEY
240a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
240b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
240c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
240d0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
240e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
240f0 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72 65 74 75  ORTED);.....retu
24100 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
24110 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
24120 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69  ...break;..}...i
24130 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  f (terminate_sig
24140 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  n) {...if (cacke
24150 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24160 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b  ion].sign_buf) {
24170 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
24180 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24190 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09  n].sign_buf);...
241a0 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73  }....cackey_sess
241b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
241c0 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ign_active = 0;.
241d0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
241e0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
241f0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24200 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
24210 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
24220 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24230 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24240 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
24250 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
24260 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
24270 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
24280 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24290 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69  eturning %i", (i
242a0 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  nt) retval);...r
242b0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
242c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
242d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
242e0 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43  gnRecoverInit)(C
242f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
24300 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
24310 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
24320 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
24330 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
24340 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24350 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24360 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
24370 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
24380 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24390 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
243a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
243b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
243c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
243d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
243e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
243f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24400 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24410 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
24420 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
24430 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
24440 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
24450 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24460 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
24470 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24480 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 29 28   C_SignRecover)(
24490 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
244a0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
244b0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
244c0 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
244d0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
244e0 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
244f0 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61  ONG_PTR pulSigna
24500 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
24510 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24520 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24530 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24540 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24560 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24570 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24580 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24590 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
245a0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
245b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
245c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
245d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
245e0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
245f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24600 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
24610 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
24620 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
24630 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24640 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
24650 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  ifyInit)(CK_SESS
24660 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
24670 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
24680 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
24690 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
246a0 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
246b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
246c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
246d0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
246e0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
246f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24700 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24710 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24720 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24730 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
24740 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
24750 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24760 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
24770 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24780 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
24790 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
247a0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
247b0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
247c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
247d0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
247e0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
247f0 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ify)(CK_SESSION_
24800 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24810 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
24820 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
24830 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
24840 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
24850 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
24860 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
24870 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24880 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24890 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
248a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
248b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
248c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
248d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
248e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
248f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
24900 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
24910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24920 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
24930 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24940 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
24950 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24960 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
24970 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
24980 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
24990 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
249a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
249b0 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45  ifyUpdate)(CK_SE
249c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
249d0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
249e0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
249f0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
24a00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24a10 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
24a20 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
24a30 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
24a40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24a50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
24a60 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
24a70 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
24a80 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
24a90 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
24aa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24ab0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
24ac0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24ad0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
24ae0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24af0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
24b00 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
24b10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
24b20 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
24b30 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
24b40 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29 28 43  C_VerifyFinal)(C
24b50 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
24b60 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
24b70 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
24b80 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
24b90 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
24ba0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24bb0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
24bc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
24bd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
24be0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24bf0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
24c00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
24c10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
24c20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
24c30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
24c40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24c50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24c60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
24c70 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
24c80 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24c90 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
24ca0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
24cb0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
24cc0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24cd0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24ce0 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
24cf0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
24d00 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
24d10 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
24d20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
24d30 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
24d40 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
24d50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
24d60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
24d70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
24d80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24d90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24da0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
24db0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24dc0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
24dd0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
24de0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
24df0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24e00 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
24e10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
24e20 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
24e30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
24e40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
24e50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24e60 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
24e70 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
24e80 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63  _RV, C_VerifyRec
24e90 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  over)(CK_SESSION
24ea0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
24eb0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
24ec0 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
24ed0 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
24ee0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
24ef0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
24f00 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b  TR pulDataLen) {
24f10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24f20 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24f30 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
24f40 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
24f50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24f60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
24f70 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
24f80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24f90 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
24fa0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
24fb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24fc0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24fd0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24fe0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
24ff0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25000 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
25010 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
25020 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25030 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
25040 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
25050 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74   C_DigestEncrypt
25060 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
25070 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
25080 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
25090 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
250a0 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  ulPartLen, CK_BY
250b0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
250c0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
250d0 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
250e0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
250f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25100 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25110 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25120 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25130 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25140 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
25150 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
25160 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
25170 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
25180 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
25190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
251a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
251b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
251c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
251d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
251e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
251f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
25200 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
25210 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25220 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
25230 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65  ryptDigestUpdate
25240 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
25250 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
25260 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
25270 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
25280 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
25290 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
252a0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
252b0 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
252c0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
252d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
252e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
252f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
25300 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25310 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25320 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
25330 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
25340 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
25350 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
25360 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
25370 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25380 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
25390 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
253a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
253b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
253c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
253d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
253e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
253f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
25400 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79  _RV, C_SignEncry
25410 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
25420 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
25430 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
25440 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
25450 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
25460 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
25470 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
25480 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
25490 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
254a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
254b0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
254c0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
254d0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
254e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
254f0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
25500 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
25510 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
25520 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
25530 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
25540 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25550 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
25560 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
25570 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
25580 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
25590 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
255a0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
255b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
255c0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
255d0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
255e0 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61  ecryptVerifyUpda
255f0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
25600 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
25610 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
25620 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
25630 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
25640 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
25650 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
25660 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
25670 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
25680 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
25690 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
256a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
256b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
256c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
256d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
256e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
256f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
25700 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
25710 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
25720 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25730 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
25740 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
25750 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
25760 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25770 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
25780 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
25790 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
257a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
257b0 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
257c0 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  eKey)(CK_SESSION
257d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
257e0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
257f0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
25800 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
25810 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
25820 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
25830 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
25840 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
25850 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25860 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25870 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25880 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25890 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
258a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
258b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
258c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
258d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
258e0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
258f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
25900 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
25910 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25920 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
25930 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
25940 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
25950 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
25960 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
25970 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25980 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
25990 65 72 61 74 65 4b 65 79 50 61 69 72 29 28 43 4b  erateKeyPair)(CK
259a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
259b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
259c0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
259d0 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42  anism, CK_ATTRIB
259e0 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69 63 4b  UTE_PTR pPublicK
259f0 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55  eyTemplate, CK_U
25a00 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65 79  LONG ulPublicKey
25a10 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
25a20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
25a30 20 70 50 72 69 76 61 74 65 4b 65 79 54 65 6d 70   pPrivateKeyTemp
25a40 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
25a50 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74 72 69  lPrivateKeyAttri
25a60 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
25a70 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
25a80 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f  phPublicKey, CK_
25a90 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
25aa0 52 20 70 68 50 72 69 76 61 74 65 4b 65 79 29 20  R phPrivateKey) 
25ab0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
25ac0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
25ad0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
25ae0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
25af0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25b00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
25b10 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
25b20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25b30 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
25b40 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25b50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25b60 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25b70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25b80 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
25b90 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
25ba0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
25bb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
25bc0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25bd0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
25be0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
25bf0 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f  , C_WrapKey)(CK_
25c00 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
25c10 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
25c20 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
25c30 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
25c40 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69 6e 67  HANDLE hWrapping
25c50 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Key, CK_OBJECT_H
25c60 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42  ANDLE hKey, CK_B
25c70 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65 64  YTE_PTR pWrapped
25c80 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  Key, CK_ULONG_PT
25c90 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65 79 4c  R pulWrappedKeyL
25ca0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
25cb0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
25cc0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
25cd0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
25ce0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25cf0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25d00 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
25d10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
25d20 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
25d30 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
25d40 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
25d50 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
25d60 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
25d70 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
25d80 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
25d90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
25da0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
25db0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25dc0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
25dd0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
25de0 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65  K_RV, C_UnwrapKe
25df0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
25e00 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
25e10 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
25e20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
25e30 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e  BJECT_HANDLE hUn
25e40 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f  wrappingKey, CK_
25e50 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65  BYTE_PTR pWrappe
25e60 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  dKey, CK_ULONG u
25e70 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20  lWrappedKeyLen, 
25e80 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
25e90 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
25ea0 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65  LONG ulAttribute
25eb0 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
25ec0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
25ed0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
25ee0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
25ef0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
25f00 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
25f10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25f20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25f30 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
25f40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
25f50 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
25f60 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
25f70 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
25f80 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25f90 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
25fa0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
25fb0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
25fc0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
25fd0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
25fe0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
25ff0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
26000 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
26010 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b 65 79  _RV, C_DeriveKey
26020 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
26030 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
26040 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
26050 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
26060 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42 61 73  JECT_HANDLE hBas
26070 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49 42 55  eKey, CK_ATTRIBU
26080 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
26090 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74  , CK_ULONG ulAtt
260a0 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
260b0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
260c0 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
260d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
260e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
260f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26100 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
26110 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26120 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
26130 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
26140 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
26150 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
26160 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
26170 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26180 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
26190 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
261a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
261b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
261c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
261d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
261e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
261f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26200 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65  ION(CK_RV, C_See
26210 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53  dRandom)(CK_SESS
26220 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
26230 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
26240 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47   pSeed, CK_ULONG
26250 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43   ulSeedLen) {..C
26260 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26270 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26280 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26290 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
262a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
262b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
262c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
262d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
262e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
262f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
26300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26310 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26320 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26330 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
26340 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26350 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
26360 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
26370 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26380 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
26390 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
263a0 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29 28  GenerateRandom)(
263b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
263c0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
263d0 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44  YTE_PTR pRandomD
263e0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
263f0 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41  RandomLen) {..CA
26400 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26410 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
26420 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
26430 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
26440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26450 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
26460 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
26470 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
26480 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
26490 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
264a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
264b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
264c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
264d0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
264e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
264f0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
26500 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
26510 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
26520 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64  }../* Deprecated
26530 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f   Function */.CK_
26540 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
26550 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63  CK_RV, C_GetFunc
26560 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f 53  tionStatus)(CK_S
26570 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26580 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45  ession) {..CACKE
26590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
265a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43  Called.");...CAC
265b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
265c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
265d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
265e0 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52  ALLEL (%i)", CKR
265f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
26600 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72  RALLEL);...retur
26610 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
26620 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
26630 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73  hSession = hSess
26640 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20  ion; /* Supress 
26650 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20  unused variable 
26660 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a  warning */.}../*
26670 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63   Deprecated Func
26680 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  tion */.CK_DEFIN
26690 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
266a0 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  , C_CancelFuncti
266b0 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  on)(CK_SESSION_H
266c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
266d0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
266e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
266f0 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
26700 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
26710 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
26720 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25  _NOT_PARALLEL (%
26730 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
26740 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
26750 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
26760 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
26770 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e  LEL);...hSession
26780 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20   = hSession; /* 
26790 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76  Supress unused v
267a0 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20  ariable warning 
267b0 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  */.}..CK_DEFINE_
267c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
267d0 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73  C_GetFunctionLis
267e0 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c  t)(CK_FUNCTION_L
267f0 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70 46 75  IST_PTR_PTR ppFu
26800 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43  nctionList) {..C
26810 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f  K_FUNCTION_LIST_
26820 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  PTR pFunctionLis
26830 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
26840 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
26850 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e  .");...if (ppFun
26860 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c  ctionList == NUL
26870 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
26880 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26890 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r. ppFunctionLis
268a0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
268b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
268c0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
268d0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  .pFunctionList =
268e0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
268f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b  pFunctionList));
26900 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ...pFunctionList
26910 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  ->version.major 
26920 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54  = ((CACKEY_CRYPT
26930 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
26940 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
26950 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
26960 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  >version.minor =
26970 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
26980 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
26990 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
269a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
269b0 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43  C_Initialize = C
269c0 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46  _Initialize;..pF
269d0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
269e0 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61  inalize = C_Fina
269f0 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  lize;..pFunction
26a00 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20  List->C_GetInfo 
26a10 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46  = C_GetInfo;..pF
26a20 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
26a30 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47  etSlotList = C_G
26a40 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75  etSlotList;..pFu
26a50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
26a60 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65  tSlotInfo = C_Ge
26a70 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e  tSlotInfo;..pFun
26a80 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
26a90 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65  TokenInfo = C_Ge
26aa0 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75  tTokenInfo;..pFu
26ab0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61  nctionList->C_Wa
26ac0 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d  itForSlotEvent =
26ad0 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76   C_WaitForSlotEv
26ae0 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ent;..pFunctionL
26af0 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e  ist->C_GetMechan
26b00 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d  ismList = C_GetM
26b10 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70  echanismList;..p
26b20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
26b30 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
26b40 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73   = C_GetMechanis
26b50 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  mInfo;..pFunctio
26b60 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b  nList->C_InitTok
26b70 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e  en = C_InitToken
26b80 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
26b90 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f  ->C_InitPIN = C_
26ba0 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  InitPIN;..pFunct
26bb0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49  ionList->C_SetPI
26bc0 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70  N = C_SetPIN;..p
26bd0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
26be0 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f  OpenSession = C_
26bf0 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46  OpenSession;..pF
26c00 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
26c10 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f  loseSession = C_
26c20 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70  CloseSession;..p
26c30 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
26c40 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
26c50 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73   = C_CloseAllSes
26c60 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f  sions;..pFunctio
26c70 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73  nList->C_GetSess
26c80 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53  ionInfo = C_GetS
26c90 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75  essionInfo;..pFu
26ca0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
26cb0 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20  tOperationState 
26cc0 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e  = C_GetOperation
26cd0 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  State;..pFunctio
26ce0 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72  nList->C_SetOper
26cf0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53  ationState = C_S
26d00 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
26d10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
26d20 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f  ->C_Login = C_Lo
26d30 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  gin;..pFunctionL
26d40 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20  ist->C_Logout = 
26d50 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63  C_Logout;..pFunc
26d60 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61  tionList->C_Crea
26d70 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65  teObject = C_Cre
26d80 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  ateObject;..pFun
26d90 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70  ctionList->C_Cop
26da0 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79  yObject = C_Copy
26db0 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
26dc0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f  onList->C_Destro
26dd0 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74  yObject = C_Dest
26de0 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  royObject;..pFun
26df0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
26e00 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47  ObjectSize = C_G
26e10 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70  etObjectSize;..p
26e20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
26e30 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
26e40 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75  e = C_GetAttribu
26e50 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74  teValue;..pFunct
26e60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74  ionList->C_SetAt
26e70 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
26e80 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
26e90 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
26ea0 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
26eb0 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62  sInit = C_FindOb
26ec0 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e  jectsInit;..pFun
26ed0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
26ee0 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e  dObjects = C_Fin
26ef0 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63  dObjects;..pFunc
26f00 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
26f10 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43  ObjectsFinal = C
26f20 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61  _FindObjectsFina
26f30 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
26f40 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74  t->C_EncryptInit
26f50 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74   = C_EncryptInit
26f60 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
26f70 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f  ->C_Encrypt = C_
26f80 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74  Encrypt;..pFunct
26f90 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
26fa0 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63  ptUpdate = C_Enc
26fb0 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
26fc0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
26fd0 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45  cryptFinal = C_E
26fe0 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46  ncryptFinal;..pF
26ff0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
27000 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44  ecryptInit = C_D
27010 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75  ecryptInit;..pFu
27020 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
27030 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70  crypt = C_Decryp
27040 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
27050 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61  t->C_DecryptUpda
27060 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70  te = C_DecryptUp
27070 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
27080 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 46  List->C_DecryptF
27090 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 70 74  inal = C_Decrypt
270a0 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
270b0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 49  nList->C_DigestI
270c0 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74 49 6e  nit = C_DigestIn
270d0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
270e0 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20 43  st->C_Digest = C
270f0 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e 63 74  _Digest;..pFunct
27100 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
27110 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65  tUpdate = C_Dige
27120 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  stUpdate;..pFunc
27130 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
27140 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 73 74  stKey = C_Digest
27150 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
27160 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e  ist->C_DigestFin
27170 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 69 6e  al = C_DigestFin
27180 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
27190 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d  st->C_SignInit =
271a0 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46   C_SignInit;..pF
271b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
271c0 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70  ign = C_Sign;..p
271d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
271e0 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43 5f 53  SignUpdate = C_S
271f0 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  ignUpdate;..pFun
27200 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
27210 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46  nFinal = C_SignF
27220 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
27230 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f  List->C_SignReco
27240 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e  verInit = C_Sign
27250 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46  RecoverInit;..pF
27260 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
27270 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f 53  ignRecover = C_S
27280 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46 75  ignRecover;..pFu
27290 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
272a0 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 65 72  rifyInit = C_Ver
272b0 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ifyInit;..pFunct
272c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
272d0 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09 70  y = C_Verify;..p
272e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
272f0 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43  VerifyUpdate = C
27300 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  _VerifyUpdate;..
27310 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
27320 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d 20 43  _VerifyFinal = C
27330 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70  _VerifyFinal;..p
27340 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
27350 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
27360 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f  t = C_VerifyReco
27370 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  verInit;..pFunct
27380 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
27390 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 65 72  yRecover = C_Ver
273a0 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 46 75  ifyRecover;..pFu
273b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
273c0 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
273d0 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e 63 72  e = C_DigestEncr
273e0 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
273f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
27400 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65  ryptDigestUpdate
27410 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69 67 65   = C_DecryptDige
27420 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  stUpdate;..pFunc
27430 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
27440 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  EncryptUpdate = 
27450 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
27460 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
27470 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 56 65  ist->C_DecryptVe
27480 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 44  rifyUpdate = C_D
27490 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61  ecryptVerifyUpda
274a0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
274b0 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65  st->C_GenerateKe
274c0 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  y = C_GenerateKe
274d0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
274e0 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  t->C_GenerateKey
274f0 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 61 74  Pair = C_Generat
27500 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 6e 63  eKeyPair;..pFunc
27510 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70  tionList->C_Wrap
27520 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b  Key = C_WrapKey;
27530 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
27540 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20 43  >C_UnwrapKey = C
27550 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46 75  _UnwrapKey;..pFu
27560 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
27570 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 72 69  riveKey = C_Deri
27580 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  veKey;..pFunctio
27590 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e  nList->C_SeedRan
275a0 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e 64  dom = C_SeedRand
275b0 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
275c0 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52 61  st->C_GenerateRa
275d0 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74  ndom = C_Generat
275e0 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74  eRandom;..pFunct
275f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75  ionList->C_GetFu
27600 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d 20 43  nctionStatus = C
27610 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
27620 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  us;..pFunctionLi
27630 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63  st->C_CancelFunc
27640 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46  tion = C_CancelF
27650 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  unction;..pFunct
27660 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75  ionList->C_GetFu
27670 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47  nctionList = C_G
27680 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a  etFunctionList;.
27690 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ..*ppFunctionLis
276a0 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t = pFunctionLis
276b0 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
276c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
276d0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
276e0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
276f0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..