Hex Artifact Content

Artifact 84da4e74947e90df9c66f85cc0ce899849a5762a:


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 5a 4c 49  .#ifdef HAVE_ZLI
0210: 42 5f 48 0a 23 20 20 69 66 64 65 66 20 48 41 56  B_H.#  ifdef HAV
0220: 45 5f 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c  E_LIBZ.#    incl
0230: 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20  ude <zlib.h>.#  
0240: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69  endif.#else.#  i
0250: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23  fdef HAVE_LIBZ.#
0260: 20 20 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c      undef HAVE_L
0270: 49 42 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  IBZ.#  endif.#en
0280: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f  dif..#define CK_
0290: 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b  PTR *.#define CK
02a0: 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
02b0: 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d  (returnType, nam
02c0: 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61  e) returnType na
02d0: 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45  me.#define CK_DE
02e0: 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72  CLARE_FUNCTION(r
02f0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
0300: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65   returnType name
0310: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c  .#define CK_DECL
0320: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49  ARE_FUNCTION_POI
0330: 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c  NTER(returnType,
0340: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0350: 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69  e (* name).#defi
0360: 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46  ne CK_CALLBACK_F
0370: 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79  UNCTION(returnTy
0380: 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e  pe, name) return
0390: 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69  Type (* name).#i
03a0: 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23  fndef NULL_PTR.#
03b0: 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54    define NULL_PT
03c0: 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63  R 0.#endif..#inc
03d0: 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a  lude "pkcs11.h".
03e0: 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78  #include "asn1-x
03f0: 35 30 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20  509.h"..#ifndef 
0400: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0410: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20  VERSION_CODE.#  
0420: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52  define CACKEY_CR
0430: 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
0440: 4f 44 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e  ODE 0x021e00.#en
0450: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41  dif..#ifndef CKA
0460: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
0470: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
0480: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
0490: 54 48 20 30 78 63 65 35 33 36 33 35 38 0a 23 65  TH 0xce536358.#e
04a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
04b0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04c0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
04d0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04e0: 54 48 20 30 78 63 65 35 33 36 33 35 39 0a 23 65  TH 0xce536359.#e
04f0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
0500: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
0510: 49 4e 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b  ING.#  define CK
0520: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
0530: 4e 49 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a  NING 0xce53635a.
0540: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43  #endif.#ifndef C
0550: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
0560: 52 4f 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66  ROTECTION.#  def
0570: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ine CKA_TRUST_EM
0580: 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30  AIL_PROTECTION 0
0590: 78 63 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66  xce53635b.#endif
05a0: 0a 0a 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31  ../* GSC-IS v2.1
05b0: 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a   Definitions */.
05c0: 2f 2a 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a  /** Classes **/.
05d0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c  #define GSCIS_CL
05e0: 41 53 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20  ASS_ISO7816     
05f0: 20 20 20 20 20 20 30 78 30 30 0a 23 64 65 66 69        0x00.#defi
0600: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  ne GSCIS_CLASS_G
0610: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20  LOBAL_PLATFORM  
0620: 20 30 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72   0x80../** Instr
0630: 75 63 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66  uctions **/.#def
0640: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0650: 47 45 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20  GET_RESPONSE    
0660: 20 20 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47    0xC0.#define G
0670: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
0680: 42 49 4e 41 52 59 20 20 20 20 20 20 20 30 78 42  BINARY       0xB
0690: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06a0: 49 4e 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e  INSTR_UPDATE_BIN
06b0: 41 52 59 20 20 20 20 20 30 78 44 36 0a 23 64 65  ARY     0xD6.#de
06c0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
06d0: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
06e0: 20 20 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20     0xA4.#define 
06f0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45  GSCIS_INSTR_EXTE
0700: 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78  RNAL_AUTH     0x
0710: 38 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  82.#define GSCIS
0720: 5f 49 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c  _INSTR_GET_CHALL
0730: 45 4e 47 45 20 20 20 20 20 30 78 38 34 0a 23 64  ENGE     0x84.#d
0740: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0750: 52 5f 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20  R_INTERNAL_AUTH 
0760: 20 20 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65      0x88.#define
0770: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
0780: 49 46 59 20 20 20 20 20 20 20 20 20 20 20 20 30  IFY            0
0790: 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x20.#define GSCI
07a0: 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20  S_INSTR_SIGN    
07b0: 20 20 20 20 20 20 20 20 20 20 30 78 32 41 0a 23            0x2A.#
07c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
07d0: 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20  TR_GET_PROP     
07e0: 20 20 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e       0x56.#defin
07f0: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0800: 54 5f 41 43 52 20 20 20 20 20 20 20 20 20 20 20  T_ACR           
0810: 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43  0x4C.#define GSC
0820: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
0830: 46 46 45 52 20 20 20 20 20 20 20 30 78 35 32 0a  FFER       0x52.
0840: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0850: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20  STR_SIGNDECRYPT 
0860: 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66        0x42..#def
0870: 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f  ine GSCIS_PARAM_
0880: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20  SELECT_APPLET   
0890: 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73    0x04../** Tags
08a0: 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61   **/./*** CCC Ta
08b0: 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  gs ***/.#define 
08c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
08e0: 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  F0.#define GSCIS
08f0: 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20  _TAG_CCC_VER    
0900: 20 20 20 20 20 20 20 20 20 30 78 46 31 0a 23 64           0xF1.#d
0910: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0920: 43 43 47 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCG_VER         
0930: 20 20 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65      0xF2.#define
0940: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
0950: 52 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  RL             0
0960: 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF3.#define GSCI
0970: 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20  S_TAG_PKCS15    
0980: 20 20 20 20 20 20 20 20 20 20 30 78 46 34 0a 23            0xF4.#
0990: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09a0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20  _REG_DATA_MODEL 
09b0: 20 20 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e       0xF5.#defin
09c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
09d0: 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20  TABLE           
09e0: 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF6.#define GSC
09f0: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55  IS_TAG_CARD_APDU
0a00: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 37 0a             0xF7.
0a10: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a20: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20  G_REDIRECTION   
0a30: 20 20 20 20 20 20 30 78 46 41 0a 23 64 65 66 69        0xFA.#defi
0a40: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20  ne GSCIS_TAG_CT 
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53   0xFB.#define GS
0a70: 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20  CIS_TAG_ST      
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 43              0xFC
0a90: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0aa0: 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20  AG_NEXTCCC      
0ab0: 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a         0xFD../**
0ac0: 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32  * General - EF 2
0ad0: 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  200 ***/.#define
0ae0: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45   GSCIS_TAG_FNAME
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0b00: 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x01.#define GSCI
0b10: 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20  S_TAG_MNAME     
0b20: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0a 23            0x02.#
0b30: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b40: 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _LNAME          
0b50: 20 20 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e       0x03.#defin
0b60: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46  e GSCIS_TAG_SUFF
0b70: 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  IX              
0b80: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x04.#define GSC
0b90: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
0ba0: 43 59 20 20 20 20 20 20 20 20 20 30 78 30 35 0a  CY         0x05.
0bb0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0bc0: 47 5f 42 55 52 45 41 55 20 20 20 20 20 20 20 20  G_BUREAU        
0bd0: 20 20 20 20 20 20 30 78 30 36 0a 23 64 65 66 69        0x06.#defi
0be0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0bf0: 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EAU_CODE        
0c00: 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53   0x07.#define GS
0c10: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
0c20: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 30 38  E           0x08
0c30: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c40: 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20  AG_TITLE        
0c50: 20 20 20 20 20 20 20 30 78 30 39 0a 23 64 65 66         0x09.#def
0c60: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ine GSCIS_TAG_BU
0c70: 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20 20 20  ILDING          
0c80: 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47    0x10.#define G
0c90: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
0ca0: 41 44 44 52 31 20 20 20 20 20 20 20 20 30 78 31  ADDR1        0x1
0cb0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
0cc0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32  TAG_OFFICE_ADDR2
0cd0: 20 20 20 20 20 20 20 20 30 78 31 32 0a 23 64 65          0x12.#de
0ce0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0cf0: 46 46 49 43 45 5f 43 49 54 59 20 20 20 20 20 20  FFICE_CITY      
0d00: 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20     0x13.#define 
0d10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d20: 5f 53 54 41 54 45 20 20 20 20 20 20 20 20 30 78  _STATE        0x
0d30: 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  14.#define GSCIS
0d40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20  _TAG_OFFICE_ZIP 
0d50: 20 20 20 20 20 20 20 20 20 30 78 31 35 0a 23 64           0x15.#d
0d60: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0d70: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20  OFFICE_COUNTRY  
0d80: 20 20 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65      0x16.#define
0d90: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0da0: 45 5f 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30  E_PHONE        0
0db0: 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x17.#define GSCI
0dc0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0dd0: 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23  NE_EXT    0x18.#
0de0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0df0: 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20 20 20  _OFFICE_FAX     
0e00: 20 20 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e       0x19.#defin
0e10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e20: 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20  CE_EMAIL        
0e30: 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43  0x1A.#define GSC
0e40: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
0e50: 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31 42 0a  OM         0x1B.
0e60: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0e70: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20  G_NONGOV_AGENCY 
0e80: 20 20 20 20 20 20 30 78 31 43 0a 23 64 65 66 69        0x1C.#defi
0e90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  ne GSCIS_TAG_SSN
0ea0: 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20  _DESIGNATOR     
0eb0: 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20   0x1D../*** PII 
0ec0: 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23  - EF 2100 ***/.#
0ed0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0ee0: 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20 20 20  _SSN            
0ef0: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e       0x20.#defin
0f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20  e GSCIS_TAG_DOB 
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0x21.#define GSC
0f30: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20  IS_TAG_GENDER   
0f40: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 32 0a             0x22.
0f50: 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f  ./*** Login Info
0f60: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30  rmation - EF 400
0f70: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
0f80: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20  SCIS_TAG_USERID 
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34               0x4
0fa0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0fb0: 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20  TAG_DOMAIN      
0fc0: 20 20 20 20 20 20 20 20 30 78 34 31 0a 23 64 65          0x41.#de
0fd0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50  fine GSCIS_TAG_P
0fe0: 41 53 53 57 4f 52 44 20 20 20 20 20 20 20 20 20  ASSWORD         
0ff0: 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61     0x42../*** Ca
1000: 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  rd Information -
1010: 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 5000 ***/.#d
1020: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1030: 49 53 53 55 45 52 49 44 20 20 20 20 20 20 20 20  ISSUERID        
1040: 20 20 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65      0x50.#define
1050: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f   GSCIS_TAG_SERNO
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1070: 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x51.#define GSCI
1080: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
1090: 20 20 20 20 20 20 20 20 20 20 30 78 35 32 0a 23            0x52.#
10a0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10b0: 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 20 20  _EXPIRE_DATE    
10c0: 20 20 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e       0x53.#defin
10d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
10e0: 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20  _TYPE           
10f0: 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x54.#define GSC
1100: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
1110: 43 4f 44 45 20 20 20 20 20 20 20 30 78 35 37 0a  CODE       0x57.
1120: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1130: 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20 20 20  G_CARDID_AID    
1140: 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a        0x58../***
1150: 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e   PKI Information
1160: 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a   - EF 7000 ***/.
1170: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1180: 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 20 20  G_CERTIFICATE   
1190: 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 66 69        0x70.#defi
11a0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  ne GSCIS_TAG_CER
11b0: 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20  T_ISSUE_DATE    
11c0: 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53   0x71.#define GS
11d0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
11e0: 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 37 32  IRE_DATE    0x72
11f0: 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73  ../** Applet IDs
1200: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43   **/.#define GSC
1210: 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20  IS_AID_CCC      
1220: 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 2c             0xA0,
1230: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1240: 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30  1, 0x16, 0xDB, 0
1250: 78 30 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  x00..#ifdef CACK
1260: 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66 64 65  EY_DEBUG.#  ifde
1270: 66 20 48 41 56 45 5f 53 54 44 49 4f 5f 48 0a 23  f HAVE_STDIO_H.#
1280: 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64      include <std
1290: 69 6f 2e 68 3e 0a 23 20 20 65 6e 64 69 66 0a 0a  io.h>.#  endif..
12a0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
12b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
12c0: 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74  ..) { fprintf(st
12d0: 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20  derr, "%s():%i: 
12e0: 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  ", __func__, __L
12f0: 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28  INE__); fprintf(
1300: 73 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72 69  stderr, x); fpri
1310: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
1320: 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43  ); }.#  define C
1330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1340: 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 7b 20  TBUF(f, x, y) { 
1350: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1360: 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65 64 20  MPBUF; unsigned 
1370: 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42 55 46  long idx; TMPBUF
1380: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
1390: 72 20 2a 29 20 28 78 29 3b 20 66 70 72 69 6e 74  r *) (x); fprint
13a0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a  f(stderr, "%s():
13b0: 25 69 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20  %i: %s  (%s/%lu 
13c0: 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63  = {%02x", __func
13d0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c  __, __LINE__, f,
13e0: 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c   #x, (unsigned l
13f0: 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46  ong) (y), TMPBUF
1400: 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d  [0]); for (idx =
1410: 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69   1; idx < (y); i
1420: 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28  dx++) { fprintf(
1430: 73 74 64 65 72 72 2c 20 22 2c 20 25 30 32 78 22  stderr, ", %02x"
1440: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20  , TMPBUF[idx]); 
1450: 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  }; fprintf(stder
1460: 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 7d 0a 23 20  r, "})\n"); }.# 
1470: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
1480: 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b  EBUG_PERROR(x) {
1490: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14a0: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f   "%s():%i: ", __
14b0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
14c0: 29 3b 20 70 65 72 72 6f 72 28 78 29 3b 20 7d 0a  ); perror(x); }.
14d0: 23 20 20 64 65 66 69 6e 65 20 66 72 65 65 28 78  #  define free(x
14e0: 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ) { CACKEY_DEBUG
14f0: 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28 25 70  _PRINTF("FREE(%p
1500: 29 20 28 25 73 29 22 2c 20 78 2c 20 23 78 29 3b  ) (%s)", x, #x);
1510: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1520: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59  tic void *CACKEY
1530: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
1540: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  OC(size_t size, 
1550: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
1560: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
1570: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
1580: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  etval = malloc(s
1590: 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ize);...fprintf(
15a0: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69  stderr, "%s():%i
15b0: 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29  : ", func, line)
15c0: 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
15d0: 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  r, "MALLOC() = %
15e0: 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70  p", retval);..fp
15f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1600: 6e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  n");...return(re
1610: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1620: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
1630: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
1640: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65  (void *ptr, size
1650: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
1660: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
1670: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
1680: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
1690: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69   realloc(ptr, si
16a0: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  ze);...if (retva
16b0: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70  l != ptr) {...fp
16c0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
16d0: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c  s():%i: ", func,
16e0: 20 6c 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e 74   line);...fprint
16f0: 66 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c 4c  f(stderr, "REALL
1700: 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70 74  OC(%p) = %p", pt
1710: 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 70  r, retval);...fp
1720: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1730: 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  n");..}...return
1740: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
1750: 74 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59  tic char *CACKEY
1760: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44  _DEBUG_FUNC_STRD
1770: 55 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  UP(const char *p
1780: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
1790: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
17a0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b  {..char *retval;
17b0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64  ...retval = strd
17c0: 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e  up(ptr);...fprin
17d0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
17e0: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69  :%i: ", func, li
17f0: 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  ne);..fprintf(st
1800: 64 65 72 72 2c 20 22 53 54 52 44 55 50 5f 4d 41  derr, "STRDUP_MA
1810: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
1820: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
1830: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 0a  stderr, "\n");..
1840: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1850: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
1860: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
1870: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
1880: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61  STR(unsigned cha
1890: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68  r tag) {..switch
18a0: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20   (tag) {...case 
18b0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
18c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
18d0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b  IS_TAG_CARDID");
18e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
18f0: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65  G_CCC_VER:....re
1900: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1910: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73  CCC_VER");...cas
1920: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
1930: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
1940: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
1950: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
1960: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
1970: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1980: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09  TAG_CARDURL");..
1990: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
19a0: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72  PKCS15:....retur
19b0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  n("GSCIS_TAG_PKC
19c0: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53  S15");...case GS
19d0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
19e0: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72  _MODEL:....retur
19f0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47  n("GSCIS_TAG_REG
1a00: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09  _DATA_MODEL");..
1a10: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1a20: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65  ACR_TABLE:....re
1a30: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1a40: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63  ACR_TABLE");...c
1a50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
1a60: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75  RD_APDU:....retu
1a70: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
1a80: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73  RD_APDU");...cas
1a90: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  e GSCIS_TAG_REDI
1aa0: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  RECTION:....retu
1ab0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
1ac0: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63  DIRECTION");...c
1ad0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ase GSCIS_TAG_CT
1ae0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1af0: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63  IS_TAG_CT");...c
1b00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ase GSCIS_TAG_ST
1b10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1b20: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63  IS_TAG_ST");...c
1b30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ase GSCIS_TAG_NE
1b40: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e  XTCCC:....return
1b50: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  ("GSCIS_TAG_NEXT
1b60: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53  CCC");...case GS
1b70: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09  CIS_TAG_FNAME:..
1b80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1b90: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_FNAME");...c
1ba0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e  ase GSCIS_TAG_MN
1bb0: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
1bc0: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22  GSCIS_TAG_MNAME"
1bd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1be0: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_LNAME:....re
1bf0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1c00: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  LNAME");...case 
1c10: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
1c20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1c30: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b  IS_TAG_SUFFIX");
1c40: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c50: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09  G_GOVT_AGENCY:..
1c60: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1c70: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22  TAG_GOVT_AGENCY"
1c80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1c90: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72  TAG_BUREAU:....r
1ca0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1cb0: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73  _BUREAU");...cas
1cc0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
1cd0: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  AU_CODE:....retu
1ce0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
1cf0: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63  REAU_CODE");...c
1d00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ase GSCIS_TAG_DE
1d10: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  PT_CODE:....retu
1d20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45  rn("GSCIS_TAG_DE
1d30: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  PT_CODE");...cas
1d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  e GSCIS_TAG_TITL
1d50: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1d60: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b  CIS_TAG_TITLE");
1d70: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d80: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72  G_BUILDING:....r
1d90: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1da0: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63  _BUILDING");...c
1db0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
1dc0: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72  FICE_ADDR1:....r
1dd0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1de0: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b  _OFFICE_ADDR1");
1df0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1e00: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a  G_OFFICE_ADDR2:.
1e10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e20: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
1e30: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  2");...case GSCI
1e40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
1e50: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
1e60: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
1e70: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ITY");...case GS
1e80: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
1e90: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TATE:....return(
1ea0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1eb0: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73  E_STATE");...cas
1ec0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1ed0: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72  CE_ZIP:....retur
1ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
1ef0: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73  ICE_ZIP");...cas
1f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1f10: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72  CE_COUNTRY:....r
1f20: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1f30: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22  _OFFICE_COUNTRY"
1f40: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1f50: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
1f60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1f70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
1f80: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ONE");...case GS
1f90: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
1fa0: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74  HONE_EXT:....ret
1fb0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1fc0: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22  FFICE_PHONE_EXT"
1fd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1fe0: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a  TAG_OFFICE_FAX:.
1ff0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2000: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22  _TAG_OFFICE_FAX"
2010: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2020: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2030: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2040: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
2050: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIL");...case GS
2060: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2070: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OOM:....return("
2080: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2090: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20  _ROOM");...case 
20a0: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
20b0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
20c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f  rn("GSCIS_TAG_NO
20d0: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09  NGOV_AGENCY");..
20e0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
20f0: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a  SSN_DESIGNATOR:.
2100: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2110: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2120: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TOR");...case GS
2130: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09  CIS_TAG_SSN:....
2140: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2150: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20  G_SSN");...case 
2160: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09  GSCIS_TAG_DOB:..
2170: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2180: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73  TAG_DOB");...cas
2190: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  e GSCIS_TAG_GEND
21a0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
21b0: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22  SCIS_TAG_GENDER"
21c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
21d0: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72  TAG_USERID:....r
21e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
21f0: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73  _USERID");...cas
2200: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  e GSCIS_TAG_DOMA
2210: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IN:....return("G
2220: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22  SCIS_TAG_DOMAIN"
2230: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2240: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09  TAG_PASSWORD:...
2250: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2260: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09  AG_PASSWORD");..
2270: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2280: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74  ISSUERID:....ret
2290: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
22a0: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73  SSUERID");...cas
22b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
22c0: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  O:....return("GS
22d0: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b  CIS_TAG_SERNO");
22e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
22f0: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  G_ISSUE_DATE:...
2300: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2310: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  AG_ISSUE_DATE");
2320: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2330: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  G_EXPIRE_DATE:..
2340: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2350: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22  TAG_EXPIRE_DATE"
2360: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2370: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09  TAG_CARD_TYPE:..
2380: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2390: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b  TAG_CARD_TYPE");
23a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
23b0: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a  G_SECURITY_CODE:
23c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
23d0: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
23e0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
23f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
2400: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2410: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
2420: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AID");...case GS
2430: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
2440: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2450: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
2460: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  ICATE");...case 
2470: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
2480: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
2490: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
24a0: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22  CERT_ISSUE_DATE"
24b0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
24c0: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
24d0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
24e0: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
24f0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
2500: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
2510: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
2520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
2530: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
2540: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c  CARDERR_TO_STR(L
2550: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09  ONG retcode) {..
2560: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29  switch (retcode)
2570: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
2580: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65  S_SUCCESS:....re
2590: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55  turn("SCARD_S_SU
25a0: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CCESS");...case 
25b0: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45  SCARD_E_CANCELLE
25c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
25d0: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22  ARD_E_CANCELLED"
25e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
25f0: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a  E_CANT_DISPOSE:.
2600: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2610: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22  _E_CANT_DISPOSE"
2620: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2630: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
2640: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UFFER:....return
2650: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  ("SCARD_E_INSUFF
2660: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b  ICIENT_BUFFER");
2670: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2680: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09  INVALID_ATR:....
2690: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
26a0: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09  INVALID_ATR");..
26b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
26c0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09  VALID_HANDLE:...
26d0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
26e0: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22  _INVALID_HANDLE"
26f0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2700: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
2710: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TER:....return("
2720: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2730: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63  PARAMETER");...c
2740: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
2750: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72  LID_TARGET:....r
2760: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
2770: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b  NVALID_TARGET");
2780: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2790: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09  INVALID_VALUE:..
27a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
27b0: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22  E_INVALID_VALUE"
27c0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
27d0: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09  E_NO_MEMORY:....
27e0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
27f0: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63  NO_MEMORY");...c
2800: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
2810: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  OWN_READER:....r
2820: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
2830: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b  NKNOWN_READER");
2840: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2850: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75  TIMEOUT:....retu
2860: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45  rn("SCARD_E_TIME
2870: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OUT");...case SC
2880: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
2890: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  OLATION:....retu
28a0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52  rn("SCARD_E_SHAR
28b0: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b  ING_VIOLATION");
28c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
28d0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09  NO_SMARTCARD:...
28e0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
28f0: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b  _NO_SMARTCARD");
2900: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2910: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09  UNKNOWN_CARD:...
2920: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2930: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b  _UNKNOWN_CARD");
2940: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2950: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a  PROTO_MISMATCH:.
2960: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2970: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
2980: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  H");...case SCAR
2990: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09  D_E_NOT_READY:..
29a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
29b0: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09  E_NOT_READY");..
29c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59  .case SCARD_E_SY
29d0: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  STEM_CANCELLED:.
29e0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
29f0: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
2a00: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
2a10: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
2a20: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CTED:....return(
2a30: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41  "SCARD_E_NOT_TRA
2a40: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73  NSACTED");...cas
2a50: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
2a60: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  _UNAVAILABLE:...
2a70: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2a80: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
2a90: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  BLE");...case SC
2aa0: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
2ab0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
2ac0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  n("SCARD_W_UNSUP
2ad0: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  PORTED_CARD");..
2ae0: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
2af0: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a  RESPONSIVE_CARD:
2b00: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2b10: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45  D_W_UNRESPONSIVE
2b20: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2b30: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
2b40: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
2b50: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  n("SCARD_W_UNPOW
2b60: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  ERED_CARD");...c
2b70: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45  ase SCARD_W_RESE
2b80: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  T_CARD:....retur
2b90: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54  n("SCARD_W_RESET
2ba0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2bb0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
2bc0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
2bd0: 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44  "SCARD_W_REMOVED
2be0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2bf0: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
2c00: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e  SMALL:....return
2c10: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f  ("SCARD_E_PCI_TO
2c20: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73  O_SMALL");...cas
2c30: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
2c40: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
2c50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2c60: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
2c70: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
2c80: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
2c90: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
2ca0: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  n("SCARD_E_DUPLI
2cb0: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09  CATE_READER");..
2cc0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
2cd0: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a  RD_UNSUPPORTED:.
2ce0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2cf0: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
2d00: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
2d10: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
2d20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2d30: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22  RD_E_NO_SERVICE"
2d40: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2d50: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
2d60: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
2d70: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
2d80: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20  OPPED");...case 
2d90: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44  SCARD_W_INSERTED
2da0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
2db0: 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  ("SCARD_W_INSERT
2dc0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
2dd0: 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50  e SCARD_E_UNSUPP
2de0: 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09  ORTED_FEATURE:..
2df0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2e00: 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45  E_UNSUPPORTED_FE
2e10: 41 54 55 52 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  ATURE");..}...re
2e20: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
2e30: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
2e40: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
2e50: 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
2e60: 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f  O_STR(uint16_t o
2e70: 62 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20  bjid) {..switch 
2e80: 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65  (objid) {...case
2e90: 20 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75   0x2000:....retu
2ea0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
2eb0: 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f  BJID_GENERALINFO
2ec0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30  ");...case 0x210
2ed0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
2ee0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50  CKEY_TLV_OBJID_P
2ef0: 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29  ROPERSONALINFO")
2f00: 3b 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a  ;...case 0x3000:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2f20: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43  EY_TLV_OBJID_ACC
2f30: 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09  ESSCONTROL");...
2f40: 63 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09  case 0x4000:....
2f50: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
2f60: 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29  LV_OBJID_LOGIN")
2f70: 3b 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a  ;...case 0x5000:
2f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2f90: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52  EY_TLV_OBJID_CAR
2fa0: 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20  DINFO");...case 
2fb0: 30 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x6000:....retur
2fc0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2fd0: 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29  JID_BIOMETRICS")
2fe0: 3b 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a  ;...case 0x7000:
2ff0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3000: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47  EY_TLV_OBJID_DIG
3010: 49 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09  ITALSIGCERT");..
3020: 09 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09  .case 0x0200:...
3030: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3040: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
3050: 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30  RSON");...case 0
3060: 78 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e  x0202:....return
3070: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3080: 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22  ID_CAC_BENEFITS"
3090: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33  );...case 0x0203
30a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30b0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
30c0: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22  C_OTHERBENEFITS"
30d0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31  );...case 0x0201
30e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30f0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3100: 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09  C_PERSONNEL");..
3110: 09 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09  .case 0x02FE:...
3120: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3130: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
3140: 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72  ICERT");..}....r
3150: 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29  eturn("UNKNOWN")
3160: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
3170: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
3180: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
3190: 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74  E_TO_STR(uint8_t
31a0: 20 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69   apptype) {..swi
31b0: 74 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a  tch (apptype) {.
31c0: 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09  ..case 0x00:....
31d0: 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a  return("NONE");.
31e0: 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09  ..case 0x01:....
31f0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3200: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29  LV_APP_GENERIC")
3210: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09  ;...case 0x02:..
3220: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3230: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
3240: 09 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09  ..case 0x03:....
3250: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3260: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
3270: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3280: 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SKI");...case 0x
3290: 30 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  04:....return("C
32a0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
32b0: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35  I");...case 0x05
32c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
32d0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45  KEY_TLV_APP_GENE
32e0: 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  RIC | CACKEY_TLV
32f0: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
3300: 73 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75  se 0x06:....retu
3310: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
3320: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f  PP_SKI | CACKEY_
3330: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
3340: 09 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72  .case 0x07:....r
3350: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3360: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3370: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3380: 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  KI | CACKEY_TLV_
3390: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09  APP_PKI");..}...
33a0: 72 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22  return("INVALID"
33b0: 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20  );.}..#  define 
33c0: 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b 45 59  malloc(x) CACKEY
33d0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
33e0: 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  OC(x, __func__, 
33f0: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66  __LINE__).#  def
3400: 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79  ine realloc(x, y
3410: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
3420: 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79  UNC_REALLOC(x, y
3430: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
3440: 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66 20 73  NE__).#  ifdef s
3450: 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64 65 66  trdup.#    undef
3460: 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64 69 66   strdup.#  endif
3470: 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75  .#  define strdu
3480: 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  p(x) CACKEY_DEBU
3490: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 78 2c  G_FUNC_STRDUP(x,
34a0: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
34b0: 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20 64 65  E__).#else.#  de
34c0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
34d0: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f  G_PRINTF(x...) /
34e0: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41  **/.#  define CA
34f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
3500: 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a  BUF(f, x, y) /**
3510: 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  /.#  define CACK
3520: 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28  EY_DEBUG_PERROR(
3530: 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  x) /**/.#  defin
3540: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
3550: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78  UNC_TAG_TO_STR(x
3560: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
3570: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
3580: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
3590: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78  CARDERR_TO_STR(x
35a0: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
35b0: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
35c0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
35d0: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22  BJID_TO_STR(x) "
35e0: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
35f0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
3600: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
3610: 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  YPE_TO_STR(x) "D
3620: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
3630: 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 63 61  endif..struct ca
3640: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
3650: 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ty {..unsigned c
3660: 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a 09  har applet[7];..
3670: 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a 0a  uint16_t file;..
3680: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
3690: 6c 61 62 65 6c 3b 0a 0a 09 73 69 7a 65 5f 74 20  label;...size_t 
36a0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
36b0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
36c0: 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09  *certificate;...
36d0: 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b  ssize_t keysize;
36e0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  .};..struct cack
36f0: 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 73  ey_identity {..s
3700: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
3710: 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
3720: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f  _identity;...CK_
3730: 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69  ATTRIBUTE *attri
3740: 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  butes;..CK_ULONG
3750: 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e   attributes_coun
3760: 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  t;.};..struct ca
3770: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09  ckey_session {..
3780: 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b  int active;...CK
3790: 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
37a0: 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74  ...CK_STATE stat
37b0: 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61  e;..CK_FLAGS fla
37c0: 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  gs;..CK_ULONG ul
37d0: 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b  DeviceError;..CK
37e0: 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
37f0: 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49  cation;..CK_NOTI
3800: 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72  FY Notify;...str
3810: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
3820: 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b  ity *identities;
3830: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3840: 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
3850: 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61  ;...int search_a
3860: 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49  ctive;..CK_ATTRI
3870: 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f  BUTE_PTR search_
3880: 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  query;..CK_ULONG
3890: 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f   search_query_co
38a0: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  unt;..unsigned l
38b0: 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f  ong search_curr_
38c0: 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61  id;...int sign_a
38d0: 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41  ctive;..CK_MECHA
38e0: 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d  NISM_TYPE sign_m
38f0: 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59  echanism;..CK_BY
3900: 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b  TE_PTR sign_buf;
3910: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3920: 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e  sign_buflen;..un
3930: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e  signed long sign
3940: 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63  _bufused;..struc
3950: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
3960: 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  y *sign_identity
3970: 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f  ;...int decrypt_
3980: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48  active;..CK_MECH
3990: 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79  ANISM_TYPE decry
39a0: 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43  pt_mechanism;..C
39b0: 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79  K_VOID_PTR decry
39c0: 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43  pt_mech_parm;..C
39d0: 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f  K_ULONG decrypt_
39e0: 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73  mech_parmlen;..s
39f0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
3a00: 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69  ntity *decrypt_i
3a10: 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72  dentity;.};..str
3a20: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
3a30: 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a  {..int active;..
3a40: 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64  .char *pcsc_read
3a50: 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63  er;...int pcsc_c
3a60: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09  ard_connected;..
3a70: 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63  SCARDHANDLE pcsc
3a80: 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61  _card;...int tra
3a90: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a  nsaction_depth;.
3aa0: 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74  ..int slot_reset
3ab0: 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ;.};..typedef en
3ac0: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56  um {..CACKEY_TLV
3ad0: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30  _APP_GENERIC = 0
3ae0: 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x01,..CACKEY_TLV
3af0: 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30  _APP_SKI     = 0
3b00: 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x02,..CACKEY_TLV
3b10: 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30  _APP_PKI     = 0
3b20: 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76  x04.} cackey_tlv
3b30: 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64  _apptype;..typed
3b40: 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45  ef enum {..CACKE
3b50: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45  Y_TLV_OBJID_GENE
3b60: 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20  RALINFO       = 
3b70: 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x2000,..CACKEY_
3b80: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
3b90: 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78  SONALINFO   = 0x
3ba0: 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  2100,..CACKEY_TL
3bb0: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
3bc0: 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30  NTROL     = 0x30
3bd0: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
3be0: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20  OBJID_LOGIN     
3bf0: 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30          = 0x4000
3c00: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
3c10: 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20  JID_CARDINFO    
3c20: 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a        = 0x5000,.
3c30: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
3c40: 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20  D_BIOMETRICS    
3c50: 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43      = 0x6000,..C
3c60: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3c70: 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20  DIGITALSIGCERT  
3c80: 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43    = 0x7000,..CAC
3c90: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3ca0: 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20  C_PERSON        
3cb0: 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45  = 0x0200,..CACKE
3cc0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3cd0: 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20  BENEFITS      = 
3ce0: 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f  0x0202,..CACKEY_
3cf0: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54  TLV_OBJID_CAC_OT
3d00: 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78  HERBENEFITS = 0x
3d10: 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0203,..CACKEY_TL
3d20: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
3d30: 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32  ONNEL     = 0x02
3d40: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
3d50: 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52  OBJID_CAC_PKICER
3d60: 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45  T       = 0x02FE
3d70: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  .} cackey_tlv_ob
3d80: 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66  jectid;..typedef
3d90: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
3da0: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
3db0: 45 4e 54 20 20 20 20 3d 20 32 2c 0a 09 43 41 43  ENT    = 2,..CAC
3dc0: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
3dd0: 41 42 53 45 4e 54 20 20 20 20 20 3d 20 31 2c 0a  ABSENT     = 1,.
3de0: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  .CACKEY_PCSC_S_O
3df0: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  K              =
3e00: 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   0,..CACKEY_PCSC
3e10: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
3e20: 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59     = -1,..CACKEY
3e30: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20  _PCSC_E_BADPIN  
3e40: 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43          = -2,..C
3e50: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
3e60: 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d  KED          = -
3e70: 33 2c 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b  3,.} cackey_ret;
3e80: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
3e90: 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75  tlv_cardurl {..u
3ea0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20  nsigned char    
3eb0: 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63      rid[5];..cac
3ec0: 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20  key_tlv_apptype 
3ed0: 20 20 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b    apptype;..cack
3ee0: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20  ey_tlv_objectid 
3ef0: 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b   objectid;..cack
3f00: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20  ey_tlv_objectid 
3f10: 20 61 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65   appid;..unsigne
3f20: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 70 69  d char        pi
3f30: 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  nid;.};..struct 
3f40: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
3f50: 79 3b 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  y;.struct cackey
3f60: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75  _tlv_entity {..u
3f70: 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a  int8_t tag;..siz
3f80: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e  e_t length;...un
3f90: 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61  ion {...void *va
3fa0: 6c 75 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61  lue;...struct ca
3fb0: 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c  ckey_tlv_cardurl
3fc0: 20 2a 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b   *value_cardurl;
3fd0: 0a 09 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65  ...uint8_t value
3fe0: 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72  _byte;..};...str
3ff0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
4000: 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b  ntity *_next;.};
4010: 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62  ../* CACKEY Glob
4020: 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74  al Handles */.st
4030: 61 74 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65  atic void *cacke
4040: 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c  y_biglock = NULL
4050: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
4060: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63  cackey_session c
4070: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31  ackey_sessions[1
4080: 32 38 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75  28];.static stru
4090: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63  ct cackey_slot c
40a0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d  ackey_slots[128]
40b0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ;.static int cac
40c0: 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
40d0: 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  = 0;.static int 
40e0: 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69  cackey_biglock_i
40f0: 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e  nit = 0;.CK_C_IN
4100: 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61  ITIALIZE_ARGS ca
4110: 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50  ckey_args;../* P
4120: 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c  CSC Global Handl
4130: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53  es */.static LPS
4140: 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b  CARDCONTEXT cack
4150: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
4160: 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75   NULL;..static u
4170: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63  nsigned long cac
4180: 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76  key_getversion(v
4190: 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75  oid) {..static u
41a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74  nsigned long ret
41b0: 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69  val = 255;..unsi
41c0: 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20  gned long major 
41d0: 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  = 0;..unsigned l
41e0: 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09  ong minor = 0;..
41f0: 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20  char *major_str 
4200: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d  = NULL;..char *m
4210: 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b  inor_str = NULL;
4220: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4230: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
4240: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  );...if (retval 
4250: 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b  != 255) {...CACK
4260: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4270: 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78  "Returning 0x%lx
4280: 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74   (cached).", ret
4290: 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  val);....return(
42a0: 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65  retval);..}...re
42b0: 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65  tval = 0;..#ifde
42c0: 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  f PACKAGE_VERSIO
42d0: 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f  N.        major_
42e0: 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45  str = PACKAGE_VE
42f0: 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f  RSION;..if (majo
4300: 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20  r_str) {..      
4310: 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75    major = strtou
4320: 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69  l(major_str, &mi
4330: 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09  nor_str, 10);...
4340: 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20  .if (minor_str) 
4350: 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72  {....minor = str
4360: 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b  toul(minor_str +
4370: 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09   1, NULL, 10);..
4380: 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d  .}..}...retval =
4390: 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c   (major << 16) |
43a0: 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23   (minor << 8);.#
43b0: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
43c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
43d0: 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72  urning 0x%lx", r
43e0: 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
43f0: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20  (retval);.}../* 
4400: 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75  PC/SC Related Fu
4410: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a  nctions */./*. *
4420: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
4430: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f   void cackey_slo
4440: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
4450: 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  l(void);. *. * A
4460: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
4470: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
4480: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
4490: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
44a0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
44b0: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
44c0: 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e   from all cards.
44d0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
44e0: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  oid cackey_slots
44f0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
4500: 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f  void) {..uint32_
4510: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
4520: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
4530: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28  lled.");...for (
4540: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
4550: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
4560: 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
4570: 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
4580: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
4590: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
45a0: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
45b0: 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b  ected) {....CACK
45c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
45d0: 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  "SCardDisconnect
45e0: 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28  (%lu) called", (
45f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
4600: 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  dx);.....SCardDi
4610: 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f  sconnect(cackey_
4620: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
4630: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
4640: 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09  E_CARD);...}....
4650: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
4660: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
4670: 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61 63  ected = 0;...cac
4680: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
4690: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
46a0: 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63   = 0;....if (cac
46b0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
46c0: 63 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b  ctive) {....CACK
46d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
46e0: 22 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20  "Marking active 
46f0: 73 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e  slot %lu as bein
4700: 67 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67  g reset", (unsig
4710: 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a  ned long) idx);.
4720: 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ..}....cackey_sl
4730: 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65  ots[idx].slot_re
4740: 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41  set = 1;..}...CA
4750: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4760: 46 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a  F("Returning");.
4770: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
4780: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
4790: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
47a0: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
47b0: 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  t(void);. *. * A
47c0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
47d0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
47e0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
47f0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
4800: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
4810: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
4820: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
4830: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
4840: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
4850: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
4860: 6e 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f  nects to the PC/
4870: 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61  SC Connection Ma
4880: 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65  nager and update
4890: 73 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f  s the. *     glo
48a0: 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20  bal handle.. *. 
48b0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
48c0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
48d0: 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  _connect(void) {
48e0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74  ..LONG scard_est
48f0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69  _context_ret;.#i
4900: 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49  fdef HAVE_SCARDI
4910: 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c  SVALIDCONTEXT..L
4920: 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69  ONG scard_isvali
4930: 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09  d_ret;.#endif...
4940: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4950: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
4960: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
4970: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
4980: 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73  ) {...cackey_pcs
4990: 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f  c_handle = mallo
49a0: 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  c(sizeof(*cackey
49b0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a  _pcsc_handle));.
49c0: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
49d0: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
49e0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
49f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
4a00: 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   to malloc() fai
4a10: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
4a20: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
4a30: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
4a40: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
4a50: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
4a60: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
4a70: 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
4a80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
4a90: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
4aa0: 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b  text() called");
4ab0: 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  ...scard_est_con
4ac0: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64  text_ret = SCard
4ad0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
4ae0: 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53  (SCARD_SCOPE_SYS
4af0: 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  TEM, NULL, NULL,
4b00: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
4b10: 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72  dle);...if (scar
4b20: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4b30: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
4b40: 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45  CESS) {....CACKE
4b50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4b60: 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74  Call to SCardEst
4b70: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61  ablishContext fa
4b80: 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25  iled (returned %
4b90: 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e  s/%li), returnin
4ba0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43  g in failure", C
4bb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4bc0: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
4bd0: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
4be0: 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  xt_ret), (long) 
4bf0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
4c00: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65  t_ret);.....free
4c10: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
4c20: 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  dle);....cackey_
4c30: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
4c40: 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  LL;.....cackey_s
4c50: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
4c60: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
4c70: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
4c80: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d  GENERIC);...}..}
4c90: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43  ..#ifdef HAVE_SC
4ca0: 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58  ARDISVALIDCONTEX
4cb0: 54 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  T..CACKEY_DEBUG_
4cc0: 50 52 49 4e 54 46 28 22 53 43 61 72 64 49 73 56  PRINTF("SCardIsV
4cd0: 61 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61  alidContext() ca
4ce0: 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69  lled");..scard_i
4cf0: 73 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61  svalid_ret = SCa
4d00: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
4d10: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
4d20: 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72  ndle);..if (scar
4d30: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d  d_isvalid_ret !=
4d40: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
4d50: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
4d60: 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c  UG_PRINTF("Handl
4d70: 65 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76  e has become inv
4d80: 61 6c 69 64 20 28 53 43 61 72 64 49 73 56 61 6c  alid (SCardIsVal
4d90: 69 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25  idContext = %s/%
4da0: 6c 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72  li), trying to r
4db0: 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c  e-establish...",
4dc0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4dd0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
4de0: 54 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64  TR(scard_isvalid
4df0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
4e00: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29  ard_isvalid_ret)
4e10: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
4e20: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45  G_PRINTF("SCardE
4e30: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
4e40: 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63  ) called");...sc
4e50: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
4e60: 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62  ret = SCardEstab
4e70: 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52  lishContext(SCAR
4e80: 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20  D_SCOPE_SYSTEM, 
4e90: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b  NULL, NULL, cack
4ea0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
4eb0: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74  ...if (scard_est
4ec0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
4ed0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
4ee0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
4ef0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
4f00: 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73  to SCardEstablis
4f10: 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20  hContext failed 
4f20: 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69  (returned %s/%li
4f30: 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  ), returning in 
4f40: 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59  failure", CACKEY
4f50: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
4f60: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
4f70: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4f80: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
4f90: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4fa0: 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b  );.....free(cack
4fb0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
4fc0: 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
4fd0: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  handle = NULL;..
4fe0: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
4ff0: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
5000: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
5010: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5020: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  IC);...}....CACK
5030: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5040: 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e  "Handle has been
5050: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22   re-established"
5060: 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43  );..}.#endif...C
5070: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5080: 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20  TF("Sucessfully 
5090: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f  connected to PC/
50a0: 53 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  SC, returning in
50b0: 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65   success");...re
50c0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
50d0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
50e0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
50f0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5100: 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
5110: 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20  ct(void);. *. * 
5120: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
5130: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
5140: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
5150: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
5160: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
5170: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
5180: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5190: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
51a0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
51b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69  This function di
51c0: 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74  sconnects from t
51d0: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74  he PC/SC Connect
51e0: 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20  ion manager and 
51f0: 75 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74  updates. *     t
5200: 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65  he global handle
5210: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
5220: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
5230: 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
5240: 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20  t(void) {..LONG 
5250: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
5260: 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_ret;...CACKEY_
5270: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
5280: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
5290: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
52a0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  e == NULL) {...r
52b0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
52c0: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63  C_S_OK);..}...sc
52d0: 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f  ard_rel_context_
52e0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61  ret = SCardRelea
52f0: 73 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65  seContext(*cacke
5300: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
5310: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
5320: 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72  c_handle) {...fr
5330: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
5340: 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b  andle);.....cack
5350: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
5360: 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28   NULL;..}...if (
5370: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
5380: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
5390: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65  _SUCCESS) {...re
53a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
53b0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
53c0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
53d0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
53e0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
53f0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
5400: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
5410: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
5420: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
5430: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5440: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
5450: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
5460: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
5470: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
5480: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5490: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
54a0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
54b0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
54c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
54d0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
54e0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
54f0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
5500: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
5510: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  ret cackey_conne
5520: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
5530: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
5540: 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ) {..cackey_ret 
5550: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
5560: 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ;..DWORD protoco
5570: 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63  l;..LONG scard_c
5580: 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  onn_ret;...CACKE
5590: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
55a0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
55b0: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
55c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
55d0: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
55e0: 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69  ecified, returni
55f0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
5600: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
5610: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5620: 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
5630: 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
5640: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
5650: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
5660: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
5670: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
5680: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5690: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
56a0: 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
56b0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
56c0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
56d0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
56e0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
56f0: 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72  ./* Connect to r
5700: 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 64  eader, if needed
5710: 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e   */..if (!slot->
5720: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
5730: 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ted) {...CACKEY_
5740: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
5750: 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 63  ardConnect(%s) c
5760: 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63  alled", slot->pc
5770: 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73 63  sc_reader);...sc
5780: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
5790: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
57a0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
57b0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
57c0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
57d0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
57e0: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74  OTOCOL_T0, &slot
57f0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
5800: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28  otocol);....if (
5810: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21  scard_conn_ret !
5820: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
5830: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
5840: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
5850: 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20  nection to card 
5860: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
5870: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43  g in failure (SC
5880: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25  ardConnect() = %
5890: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
58a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
58b0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
58c0: 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e  _conn_ret), (lon
58d0: 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  g) scard_conn_re
58e0: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
58f0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5900: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c  ERIC);...}....sl
5910: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
5920: 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73  nnected = 1;...s
5930: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
5940: 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a  _depth = 0;..}..
5950: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5960: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
5970: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
5980: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
5990: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
59a0: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
59b0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
59c0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
59d0: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
59e0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
59f0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
5a00: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
5a10: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
5a20: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
5a30: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
5a40: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
5a50: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
5a60: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
5a70: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
5a80: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72  ES. *     The tr
5a90: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  ansaction should
5aa0: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75   be terminated u
5ab0: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64  sing "cackey_end
5ac0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a  _transaction". *
5ad0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
5ae0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
5af0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
5b00: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5b10: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
5b20: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
5b30: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73  onn_ret;..LONG s
5b40: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a  card_trans_ret;.
5b50: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5b60: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
5b70: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ;...cackey_conn_
5b80: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
5b90: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
5ba0: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e  ..if (cackey_con
5bb0: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
5bc0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
5bd0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5be0: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
5bf0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
5c00: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
5c10: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
5c20: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5c30: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
5c40: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
5c50: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth++;...if (slo
5c60: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
5c70: 65 70 74 68 20 3e 20 31 29 20 7b 0a 09 09 43 41  epth > 1) {...CA
5c80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5c90: 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20  F("Already in a 
5ca0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72  transaction, per
5cb0: 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f  forming no actio
5cc0: 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25  n (new depth = %
5cd0: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73  i)", slot->trans
5ce0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a  action_depth);..
5cf0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5d00: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
5d10: 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  .scard_trans_ret
5d20: 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72 61   = SCardBeginTra
5d30: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70  nsaction(slot->p
5d40: 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20 28  csc_card);..if (
5d50: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
5d60: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
5d70: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
5d80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
5d90: 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72 61  ble to begin tra
5da0: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
5db0: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a  ing in error");.
5dc0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5dd0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
5de0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
5df0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65  BUG_PRINTF("Suce
5e00: 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74 72  ssfully began tr
5e10: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f  ansaction on slo
5e20: 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70  t (%s)", slot->p
5e30: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72  csc_reader);...r
5e40: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5e50: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
5e60: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
5e70: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
5e80: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
5e90: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
5ea0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
5eb0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5ec0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
5ed0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
5ee0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
5ef0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
5f00: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5f10: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
5f20: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
5f30: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
5f40: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
5f50: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
5f60: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
5f70: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
5f80: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63 61  ion requires "ca
5f90: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
5fa0: 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63 61  action" to be ca
5fb0: 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a  lled first. *. *
5fc0: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
5fd0: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ret cackey_end_t
5fe0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
5ff0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
6000: 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  lot) {..LONG sca
6010: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09  rd_trans_ret;...
6020: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6030: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
6040: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
6050: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
6060: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
6070: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
6080: 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64  is not connected
6090: 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  , unable to end 
60a0: 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 0a  transaction");..
60b0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
60c0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
60d0: 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
60e0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
60f0: 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  h == 0) {...CACK
6100: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6110: 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74  "Terminating a t
6120: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
6130: 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29  has not begun!")
6140: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
6150: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6160: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
6170: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
6180: 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  --;...if (slot->
6190: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
61a0: 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45  h > 0) {...CACKE
61b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
61c0: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
61d0: 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  ll in progress, 
61e0: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  not terminating 
61f0: 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74  on-card Transact
6200: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
6210: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
6220: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
6230: 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  th);....return(C
6240: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6250: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  ERIC);..}...scar
6260: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
6270: 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  ardEndTransactio
6280: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
6290: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
62a0: 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ARD);..if (scard
62b0: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
62c0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
62d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
62e0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
62f0: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
6300: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
6310: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
6320: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6330: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
6340: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6350: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
6360: 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e   terminated tran
6370: 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20  saction on slot 
6380: 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73  (%s)", slot->pcs
6390: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74  c_reader);...ret
63a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
63b0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44  S_OK);.}../* APD
63c0: 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  U Related Functi
63d0: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
63e0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
63f0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
6400: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
6410: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
6420: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
6430: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
6440: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
6450: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
6460: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
6470: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
6480: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
6490: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
64a0: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
64b0: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
64c0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
64d0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
64e0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
64f0: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
6500: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
6510: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
6520: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
6530: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
6540: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
6550: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20  ned char class. 
6560: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43  *         APDU C
6570: 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53  lass (GSCIS_CLAS
6580: 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43  S_ISO7816 or GSC
6590: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
65a0: 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20  PLATFORM. *     
65b0: 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43      usually), (C
65c0: 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  LA). *. *     un
65d0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
65e0: 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20  ruction. *      
65f0: 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74     APDU Instruct
6600: 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20  ion (INS). *. * 
6610: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
6620: 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20  r p1. *         
6630: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31  APDU Parameter 1
6640: 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20   (P1). *. *     
6650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32  unsigned char p2
6660: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
6670: 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32   Parameter 2 (P2
6680: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
6690: 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20  gned char lc. * 
66a0: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e          APDU Len
66b0: 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28  gth of Content (
66c0: 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Lc) -- this is t
66d0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61  he length of "da
66e0: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70  ta". *         p
66f0: 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64  arameter.  If "d
6700: 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65  ata" is specifie
6710: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
6720: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20  parameter will. 
6730: 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e  *         be ign
6740: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
6750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
6760: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50  ata. *         P
6770: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
6780: 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68   to send.  It sh
6790: 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74  ould be "Lc" byt
67a0: 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20  es long.  If. * 
67b0: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
67c0: 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20  d as NULL, "Lc" 
67d0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74  will not be sent
67e0: 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65  , and this buffe
67f0: 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20  r will be. *    
6800: 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a       ignored.. *
6810: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
6820: 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20   char le. *     
6830: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
6840: 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28  of Expectation (
6850: 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Le) -- this is t
6860: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
6870: 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65  . *         expe
6880: 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20  cted reply.  If 
6890: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65  this is specifie
68a0: 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77  d as 0 then it w
68b0: 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20  ill not. *      
68c0: 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20     be sent.. *. 
68d0: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a  *     uint16_t *
68e0: 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20  respcode. *     
68f0: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65      [OUT] Pointe
6900: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20  r to storage of 
6910: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f  APDU response co
6920: 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a  de.  If this is.
6930: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
6940: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
6950: 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20  e response code 
6960: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
6970: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
6980: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
6990: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
69a0: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
69b0: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
69c0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20   response data. 
69d0: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
69e0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
69f0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
6a00: 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c  sponse data will
6a10: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20   be discarded.  
6a20: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68  If. *         th
6a30: 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22  e "respdata_len"
6a40: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70   parameter is sp
6a50: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
6a60: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20   this buffer. * 
6a70: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74          will not
6a80: 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a   be updated.. *.
6a90: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72   *     size_t *r
6aa0: 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20  espdata_len. *  
6ab0: 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d         [IN, OUT]
6ac0: 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c   Pointer initial
6ad0: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
6ae0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22  he size of the "
6af0: 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20  respdata". *    
6b00: 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65       buffer.  Be
6b10: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
6b20: 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76  the pointed to v
6b30: 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20  alue is updated 
6b40: 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  to the. *       
6b50: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    number of byte
6b60: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
6b70: 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69   buffer.  If thi
6b80: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
6b90: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c  s. *         NUL
6ba0: 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  L, it will not b
6bb0: 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22  e updated, and "
6bc0: 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62  respdata" will b
6bd0: 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e  e ignored causin
6be0: 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  g. *         the
6bf0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74   response data t
6c00: 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  o be discarded..
6c10: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
6c20: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
6c30: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
6c40: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
6c50: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
6c60: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
6c70: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
6c80: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
6c90: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e  unction will con
6ca0: 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53  nect to the PC/S
6cb0: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e  C Connection Man
6cc0: 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20  ager via. *     
6cd0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
6ce0: 65 63 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e  ect() if needed.
6cf0: 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69  . *. *     It wi
6d00: 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68  ll connect to th
6d10: 65 20 63 61 72 64 20 69 6e 20 74 68 65 20 72 65  e card in the re
6d20: 61 64 65 72 20 61 74 74 61 63 68 65 64 20 74 6f  ader attached to
6d30: 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20   the slot. *    
6d40: 20 73 70 65 63 69 66 69 65 64 2e 20 20 49 74 20   specified.  It 
6d50: 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74  will reconnect t
6d60: 6f 20 74 68 65 20 63 61 72 64 20 69 66 20 74 68  o the card if th
6d70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20  e connection. * 
6d80: 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20      goes away.. 
6d90: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
6da0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
6db0: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
6dc0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
6dd0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
6de0: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
6df0: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
6e00: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
6e10: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
6e20: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
6e30: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
6e40: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
6e50: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
6e60: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
6e70: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
6e80: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
6e90: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
6ea0: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61  n) {..uint8_t ma
6eb0: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63  jor_rc, minor_rc
6ec0: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f  ;..size_t bytes_
6ed0: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73  to_copy, tmp_res
6ee0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 44 57 4f 52  pdata_len;..DWOR
6ef0: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f  D protocol;..DWO
6f00: 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63  RD xmit_len, rec
6f10: 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  v_len;..LONG sca
6f20: 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61  rd_xmit_ret, sca
6f30: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09  rd_reconn_ret;..
6f40: 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30  BYTE xmit_buf[10
6f50: 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30  24], recv_buf[10
6f60: 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  24];..int pcsc_c
6f70: 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63  onnect_ret, pcsc
6f80: 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69  _getresp_ret;..i
6f90: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  nt idx;...CACKEY
6fa0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6fb0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
6fc0: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45  !slot) {...CACKE
6fd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6fe0: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65  Invalid slot spe
6ff0: 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65  cified.");....re
7000: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7010: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7020: 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
7030: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
7040: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
7050: 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
7060: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
7070: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
7080: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7090: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
70a0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
70b0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
70c0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
70d0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
70e0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
70f0: 20 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d   Transmit */..xm
7100: 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69  it_len = 0;..xmi
7110: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
7120: 5d 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74  ] = class;..xmit
7130: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
7140: 20 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a   = instruction;.
7150: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
7160: 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69  en++] = p1;..xmi
7170: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
7180: 5d 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74  ] = p2;..if (dat
7190: 61 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b  a) {...xmit_buf[
71a0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63  xmit_len++] = lc
71b0: 3b 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
71c0: 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b  ; idx < lc; idx+
71d0: 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66  +) {....xmit_buf
71e0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64  [xmit_len++] = d
71f0: 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d  ata[idx];...}..}
7200: 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30  ...if (le != 0x0
7210: 30 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b  0) {...xmit_buf[
7220: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65  xmit_len++] = le
7230: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20  ;..}.../* Begin 
7240: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
7250: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
7260: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
7270: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28  on(slot);...if (
7280: 63 6c 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43  class == GSCIS_C
7290: 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20  LASS_ISO7816 && 
72a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47  instruction == G
72b0: 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
72c0: 59 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 20  Y && p1 == 0x00 
72d0: 26 26 20 70 32 20 3d 3d 20 30 78 30 30 29 20 7b  && p2 == 0x00) {
72e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
72f0: 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20  PRINTF("Sending 
7300: 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64  APDU: <<censored
7310: 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  >>");..} else {.
7320: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7330: 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67  RINTBUF("Sending
7340: 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75   APDU:", xmit_bu
7350: 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d  f, xmit_len);..}
7360: 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
7370: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
7380: 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  .scard_xmit_ret 
7390: 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  = SCardTransmit(
73a0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
73b0: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c 20 78   SCARD_PCI_T0, x
73c0: 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65  mit_buf, xmit_le
73d0: 6e 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 31 2c  n, SCARD_PCI_T1,
73e0: 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76   recv_buf, &recv
73f0: 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 73 63 61 72  _len);..if (scar
7400: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43  d_xmit_ret != SC
7410: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
7420: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7430: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
7440: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63  o send APDU to c
7450: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
7460: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c  it() = %s/%lx)",
7470: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
7480: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
7490: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
74a0: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t), (unsigned lo
74b0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
74c0: 65 74 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  et);...CACKEY_DE
74d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b  BUG_PRINTF("Mark
74e0: 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69  ing slot as havi
74f0: 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b  ng been reset");
7500: 0a 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
7510: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
7520: 0a 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65  ...slot->slot_re
7530: 73 65 74 20 3d 20 31 3b 0a 0a 09 09 69 66 20 28  set = 1;....if (
7540: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
7550: 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
7560: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
7570: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7580: 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
7590: 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
75a0: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
75b0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
75c0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
75d0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
75e0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
75f0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7600: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
7610: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
7620: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e  .if (scard_recon
7630: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  n_ret == SCARD_S
7640: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
7650: 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20  /* Re-establish 
7660: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
7670: 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a  it was present *
7680: 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e  /.....if (slot->
7690: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
76a0: 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  h > 0) {......sl
76b0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
76c0: 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61  depth--;......ca
76d0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
76e0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09  action(slot);...
76f0: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
7700: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
7710: 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20  set successful, 
7720: 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29  retransmitting")
7730: 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74  ;.....scard_xmit
7740: 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e  _ret = SCardTran
7750: 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  smit(slot->pcsc_
7760: 63 61 72 64 2c 20 53 43 41 52 44 5f 50 43 49 5f  card, SCARD_PCI_
7770: 54 30 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  T0, xmit_buf, xm
7780: 69 74 5f 6c 65 6e 2c 20 53 43 41 52 44 5f 50 43  it_len, SCARD_PC
7790: 49 5f 54 30 2c 20 72 65 63 76 5f 62 75 66 2c 20  I_T0, recv_buf, 
77a0: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09  &recv_len);.....
77b0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
77c0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
77d0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
77e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
77f0: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66  TF("Retransmit f
7800: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
7810: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65   in failure afte
7820: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  r disconnecting 
7830: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54  the card (SCardT
7840: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69  ransmit = %s/%li
7850: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
7860: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
7870: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
7880: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
7890: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
78a0: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
78b0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
78c0: 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45  card, SCARD_RESE
78d0: 54 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c  T_CARD);......sl
78e0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
78f0: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
7900: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7910: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7920: 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  */......slot->tr
7930: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
7940: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
7950: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
7960: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65  (slot);.......re
7970: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7980: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 09  _E_GENERIC);....
7990: 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  .}....} else {..
79a0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
79b0: 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65  PRINTF("Disconne
79c0: 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09  cting card");...
79d0: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
79e0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
79f0: 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f  rd, SCARD_RESET_
7a00: 43 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d  CARD);.....slot-
7a10: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
7a20: 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f  cted = 0;....../
7a30: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
7a40: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
7a50: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
7a60: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
7a70: 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
7a80: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
7a90: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
7aa0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
7ab0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
7ac0: 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
7ad0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7ae0: 45 52 49 43 29 3b 0a 09 09 09 7d 0a 09 09 7d 20  ERIC);....}...} 
7af0: 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
7b00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
7b10: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72  isconnecting car
7b20: 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  d");.....SCardDi
7b30: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
7b40: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
7b50: 52 45 53 45 54 5f 43 41 52 44 29 3b 0a 09 09 09  RESET_CARD);....
7b60: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
7b70: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
7b80: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7b90: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7ba0: 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  */....slot->tran
7bb0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
7bc0: 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  1;....cackey_end
7bd0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
7be0: 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  t);.....CACKEY_D
7bf0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
7c00: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7c10: 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43  e");....return(C
7c20: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7c30: 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  ERIC);...}..}...
7c40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7c50: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20  NTBUF("Returned 
7c60: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75  Value:", recv_bu
7c70: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  f, recv_len);...
7c80: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32  if (recv_len < 2
7c90: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c  ) {.../* Minimal
7ca0: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68   response length
7cb0: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74   is 2 bytes, ret
7cc0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7cd0: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  e */...CACKEY_DE
7ce0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
7cf0: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  onse too small, 
7d00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
7d10: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d  lure (recv_len =
7d20: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
7d30: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
7d40: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  );..../* End Sma
7d50: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
7d60: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
7d70: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
7d80: 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  lot);....return(
7d90: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7da0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
7db0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74  Determine result
7dc0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f   code */..major_
7dd0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
7de0: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69  cv_len - 2];..mi
7df0: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75  nor_rc = recv_bu
7e00: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b  f[recv_len - 1];
7e10: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20  ..if (respcode) 
7e20: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20  {...*respcode = 
7e30: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20  (major_rc << 8) 
7e40: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a  | minor_rc;..}..
7e50: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61  ./* Adjust messa
7e60: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65  ge buffer */..re
7e70: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f  cv_len -= 2;.../
7e80: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72  * Add bytes to r
7e90: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09  eturn value */..
7ea0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
7eb0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64   = 0;..if (respd
7ec0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f  ata && respdata_
7ed0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73  len) {...tmp_res
7ee0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73  pdata_len = *res
7ef0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79  pdata_len;....by
7f00: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72  tes_to_copy = *r
7f10: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09  espdata_len;....
7f20: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62  if (recv_len < b
7f30: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a  ytes_to_copy) {.
7f40: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
7f50: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d   = recv_len;...}
7f60: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7f70: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67  _PRINTF("Copying
7f80: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68   %lu bytes to th
7f90: 65 20 62 75 66 66 65 72 22 2c 20 28 75 6e 73 69  e buffer", (unsi
7fa0: 67 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73  gned long) bytes
7fb0: 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 09 6d 65  _to_copy);....me
7fc0: 6d 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72  mcpy(respdata, r
7fd0: 65 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74  ecv_buf, bytes_t
7fe0: 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64  o_copy);...respd
7ff0: 61 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  ata += bytes_to_
8000: 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61  copy;....*respda
8010: 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74  ta_len = bytes_t
8020: 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65  o_copy;...tmp_re
8030: 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79  spdata_len -= by
8040: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20  tes_to_copy;..} 
8050: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63  else {...if (rec
8060: 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  v_len != 0) {...
8070: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8080: 49 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61  INTF("Throwing a
8090: 77 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e  way %lu bytes, n
80a0: 6f 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68  owhere to put th
80b0: 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  em!", (unsigned 
80c0: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b  long) recv_len);
80d0: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61  ...}..}...if (ma
80e0: 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20  jor_rc == 0x61) 
80f0: 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74  {.../* We need t
8100: 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b  o READ */...CACK
8110: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8120: 22 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71  "Buffer read req
8130: 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28  uired");....if (
8140: 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30  minor_rc == 0x00
8150: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8160: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
8170: 20 6f 66 20 30 20 62 79 74 65 73 20 69 73 20 61   of 0 bytes is a
8180: 20 6e 6f 2d 6f 70 2c 20 72 65 74 75 72 6e 69 6e   no-op, returnin
8190: 67 20 69 6e 20 73 75 63 63 65 73 73 2e 22 29 3b  g in success.");
81a0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
81b0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
81c0: 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 74 72 65  .}....pcsc_getre
81d0: 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  sp_ret = cackey_
81e0: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
81f0: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
8200: 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  816, GSCIS_INSTR
8210: 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20 30  _GET_RESPONSE, 0
8220: 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e 55  x00, 0x00, 0, NU
8230: 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 65  LL, minor_rc, re
8240: 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61 74 61  spcode, respdata
8250: 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  , &tmp_respdata_
8260: 6c 65 6e 29 3b 0a 09 09 69 66 20 28 70 63 73 63  len);...if (pcsc
8270: 5f 67 65 74 72 65 73 70 5f 72 65 74 20 21 3d 20  _getresp_ret != 
8280: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8290: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
82a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66  BUG_PRINTF("Buff
82b0: 65 72 20 72 65 61 64 20 66 61 69 6c 65 64 21 20  er read failed! 
82c0: 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   Returning in fa
82d0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20  ilure");...../* 
82e0: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
82f0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
8300: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
8310: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
8320: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8330: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
8340: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70  ...}....if (resp
8350: 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a  data_len) {....*
8360: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20  respdata_len += 
8370: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
8380: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20  ;...}..../* End 
8390: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
83a0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ction */...cacke
83b0: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
83c0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b  n(slot);....CACK
83d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
83e0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
83f0: 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72 65  ccess (buffer re
8400: 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a  ad complete)");.
8410: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8420: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
8430: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
8440: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
8450: 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
8460: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
8470: 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d  ..if (major_rc =
8480: 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53  = 0x90) {.../* S
8490: 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b  uccess */...CACK
84a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
84b0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
84c0: 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20  ccess (major_rc 
84d0: 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 65  = 0x90)");....re
84e0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
84f0: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41  _S_OK);..}....CA
8500: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8510: 46 28 22 41 50 44 55 20 52 65 74 75 72 6e 65 64  F("APDU Returned
8520: 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 72   an error, retur
8530: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
8540: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8550: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8560: 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  C);.}../*. * SYN
8570: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69  POSIS. *     ssi
8580: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64  ze_t cackey_read
8590: 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63  _buffer(struct c
85a0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
85b0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
85c0: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
85d0: 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20  count, unsigned 
85e0: 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a  char t_or_v, siz
85f0: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
8600: 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  et);. *. * ARGUM
8610: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
8620: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
8630: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
8640: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
8650: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
8660: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
8670: 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20   *buffer. *     
8680: 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72      [OUT] Buffer
8690: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
86a0: 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20  t count. *      
86b0: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
86c0: 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  es to attempt to
86d0: 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20   read. *. *     
86e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
86f0: 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20  or_v. *         
8700: 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66  Select the T-buf
8710: 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75  fer (01) or V-bu
8720: 66 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61  ffer (02) to rea
8730: 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20  d from.  . *. * 
8740: 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69      size_t initi
8750: 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20  al_offset. *    
8760: 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65       Specify the
8770: 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
8780: 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20   the read from. 
8790: 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  *. *. * RETURN V
87a0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73  ALUE. *     This
87b0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
87c0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
87d0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
87e0: 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72  ead, or -1 on er
87f0: 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  ror.. *. * NOTES
8800: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
8810: 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
8820: 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  _t cackey_read_b
8830: 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63  uffer(struct cac
8840: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
8850: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
8860: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f  uffer, size_t co
8870: 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  unt, unsigned ch
8880: 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f  ar t_or_v, size_
8890: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
88a0: 29 20 7b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73  ) {..size_t offs
88b0: 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73  et = 0, max_offs
88c0: 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09  et, max_count;..
88d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d  unsigned char cm
88e0: 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20  d[2];..uint16_t 
88f0: 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73  respcode;..int s
8900: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  end_ret;...CACKE
8910: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8920: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 6d 61 78  Called.");...max
8930: 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b  _offset = count;
8940: 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 32 35  ..max_count = 25
8950: 32 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20  2;...if (t_or_v 
8960: 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21  != 1 && t_or_v !
8970: 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 2) {...CACKEY_
8980: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
8990: 76 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72  valid T or V par
89a0: 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 64  ameter specified
89b0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
89c0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
89d0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d  urn(-1);..}...cm
89e0: 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a  d[0] = t_or_v;..
89f0: 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69  .while (1) {...i
8a00: 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78  f (offset >= max
8a10: 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41  _offset) {....CA
8a20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8a30: 46 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d  F("Buffer too sm
8a40: 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77  all, returning w
8a50: 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b  hat we got...");
8a60: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
8a70: 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f  ...count = max_o
8a80: 66 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a  ffset - offset;.
8a90: 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61  ..if (count > ma
8aa0: 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f  x_count) {....co
8ab0: 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b  unt = max_count;
8ac0: 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d  ...}....cmd[1] =
8ad0: 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f   count;....send_
8ae0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
8af0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
8b00: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
8b10: 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f  PLATFORM, GSCIS_
8b20: 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45  INSTR_READ_BUFFE
8b30: 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66  R, ((initial_off
8b40: 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e  set + offset) >>
8b50: 20 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69   8) & 0xff, (ini
8b60: 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66  tial_offset + of
8b70: 66 73 65 74 29 20 26 20 30 78 66 66 2c 20 73 69  fset) & 0xff, si
8b80: 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20  zeof(cmd), cmd, 
8b90: 30 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c  0x00, &respcode,
8ba0: 20 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74   buffer + offset
8bb0: 2c 20 26 63 6f 75 6e 74 29 3b 0a 09 09 69 66 20  , &count);...if 
8bc0: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
8bd0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
8be0: 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65  ....if (respcode
8bf0: 20 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09   == 0x6A86) {...
8c00: 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20  ..if (max_count 
8c10: 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65  == 1) {......bre
8c20: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d  ak;.....}......m
8c30: 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63  ax_count = max_c
8c40: 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63  ount / 2;......c
8c50: 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
8c60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8c70: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65  RINTF("cackey_se
8c80: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64  nd_apdu() failed
8c90: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
8ca0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65  ailure");.....re
8cb0: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
8cc0: 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74  .offset += count
8cd0: 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c  ;....if (count <
8ce0: 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09   max_count) {...
8cf0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8d00: 49 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61 64  INTF("Short read
8d10: 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20   -- count = %i, 
8d20: 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69  cmd[1] = %i", (i
8d30: 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29  nt) count, (int)
8d40: 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72   cmd[1]);.....br
8d50: 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66  eak;...}..}..#if
8d60: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e  def CACKEY_PARAN
8d70: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f  OID.#  ifdef _PO
8d80: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69  SIX_SSIZE_MAX..i
8d90: 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53  f (offset > _POS
8da0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
8db0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8dc0: 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78  RINTF("Offset ex
8dd0: 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
8de0: 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
8df0: 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
8e00: 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20  = %li, offset = 
8e10: 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
8e20: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
8e30: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
8e40: 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75  offset);....retu
8e50: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
8e60: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  dif.#endif...CAC
8e70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8e80: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
8e90: 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75  uccess, read %lu
8ea0: 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e   bytes", (unsign
8eb0: 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29  ed long) offset)
8ec0: 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65  ;...return(offse
8ed0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  t);.}../*. * SYN
8ee0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
8ef0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
8f00: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72  elect_applet(str
8f10: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
8f20: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
8f30: 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f  char *aid, size_
8f40: 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  t aid_len);. *. 
8f50: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
8f60: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
8f70: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
8f80: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
8f90: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
8fa0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
8fb0: 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20  ed char *aid. * 
8fc0: 20 20 20 20 20 20 20 20 42 75 66 66 65 72 20 63          Buffer c
8fd0: 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74  ontaining Applet
8fe0: 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a   ID to select. *
8ff0: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61  . *     size_t a
9000: 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20  id_len. *       
9010: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
9020: 73 20 69 6e 20 74 68 65 20 22 61 69 64 22 20 28  s in the "aid" (
9030: 41 70 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d  Applet ID) param
9040: 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52  eter. *. * RETUR
9050: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
9060: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
9070: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
9080: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
9090: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
90a0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
90b0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
90c0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
90d0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
90e0: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
90f0: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
9100: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
9110: 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20  gned char *aid, 
9120: 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20  size_t aid_len) 
9130: 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  {..int send_ret;
9140: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9150: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
9160: 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
9170: 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65  G_PRINTBUF("Sele
9180: 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20  cting applet:", 
9190: 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a  aid, aid_len);..
91a0: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
91b0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
91c0: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
91d0: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
91e0: 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49  STR_SELECT, GSCI
91f0: 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41  S_PARAM_SELECT_A
9200: 50 50 4c 45 54 2c 20 30 78 30 43 2c 20 61 69 64  PPLET, 0x0C, aid
9210: 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c  _len, aid, 0x00,
9220: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
9230: 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  L);..if (send_re
9240: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
9250: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
9260: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9270: 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61  Failed to open a
9280: 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67  pplet, returning
9290: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
92a0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
92b0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
92c0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
92d0: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65  UG_PRINTF("Succe
92e0: 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64  ssfully selected
92f0: 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72   file");...retur
9300: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
9310: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
9320: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
9330: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
9340: 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75  select_file(stru
9350: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
9360: 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65  slot, uint16_t e
9370: 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  f);. *. * ARGUME
9380: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
9390: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
93a0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
93b0: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
93c0: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
93d0: 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a    uint16_t ef. *
93e0: 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74           Element
93f0: 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63  al File to selec
9400: 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  t. *. * RETURN V
9410: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
9420: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
9430: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
9440: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
9450: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
9460: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
9470: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
9480: 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d   selects an Elem
9490: 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46 29  entary File (EF)
94a0: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 72 65   under the curre
94b0: 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a  ntly selected. *
94c0: 20 20 20 20 20 44 65 64 69 63 61 74 65 64 20 46       Dedicated F
94d0: 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20  ile (DF). *. *  
94e0: 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69     Typically thi
94f0: 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  s is called afte
9500: 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20  r selecting the 
9510: 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20 28  correct Applet (
9520: 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63  using. *     cac
9530: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
9540: 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a  t) for VM cards.
9550: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
9560: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
9570: 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75  select_file(stru
9580: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
9590: 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65  slot, uint16_t e
95a0: 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  f) {..unsigned c
95b0: 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a  har fid_buf[2];.
95c0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
95d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
95e0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
95f0: 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65  .../* Open the e
9600: 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a  lementary file *
9610: 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20  /..fid_buf[0] = 
9620: 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66  (ef >> 8) & 0xff
9630: 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20  ;..fid_buf[1] = 
9640: 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43  ef & 0xff;...CAC
9650: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9660: 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65  ("Selecting file
9670: 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67  : %04lx", (unsig
9680: 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a  ned long) ef);..
9690: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
96a0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
96b0: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
96c0: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
96d0: 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32  STR_SELECT, 0x02
96e0: 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66  , 0x0C, sizeof(f
96f0: 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66  id_buf), fid_buf
9700: 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55  , 0x00, NULL, NU
9710: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  LL, NULL);..if (
9720: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
9730: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
9740: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9750: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
9760: 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75   open file, retu
9770: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
9780: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
9790: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
97a0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
97b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
97c0: 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c  Successfully sel
97d0: 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09  ected file");...
97e0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
97f0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
9800: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
9810: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66     void cackey_f
9820: 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ree_tlv(struct c
9830: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
9840: 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41   *root);. *. * A
9850: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
9860: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
9870: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20  v_entity *root. 
9880: 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f  *         Root o
9890: 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74  f the TLV list t
98a0: 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a  o start freeing.
98b0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
98c0: 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  UE. *     None. 
98d0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
98e0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
98f0: 66 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69  frees the TLV li
9900: 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74 75  nked listed retu
9910: 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20  rned from. *    
9920: 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c   "cackey_read_tl
9930: 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  v". *. */.static
9940: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
9950: 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63  e_tlv(struct cac
9960: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
9970: 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20  root) {..struct 
9980: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
9990: 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a  y *curr, *next;.
99a0: 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55  ..if (root == NU
99b0: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a  LL) {...return;.
99c0: 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d  .}...for (curr =
99d0: 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72   root; curr; cur
99e0: 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65  r = next) {...ne
99f0: 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74  xt = curr->_next
9a00: 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72  ;....switch (cur
9a10: 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73  r->tag) {....cas
9a20: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
9a30: 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47  TABLE:....case G
9a40: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
9a50: 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75  CATE:.....if (cu
9a60: 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09  rr->value) {....
9a70: 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c  ..free(curr->val
9a80: 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62  ue);.....}.....b
9a90: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
9aa0: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a  CIS_TAG_CARDURL:
9ab0: 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76  .....if (curr->v
9ac0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a  alue_cardurl) {.
9ad0: 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e  .....free(curr->
9ae0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a  value_cardurl);.
9af0: 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
9b00: 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72  ...}....free(cur
9b10: 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b  r);..}...return;
9b20: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
9b30: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
9b40: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
9b50: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
9b60: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
9b70: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
9b80: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
9b90: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  . */.static stru
9ba0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
9bb0: 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61  tity *cackey_rea
9bc0: 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63  d_tlv(struct cac
9bd0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
9be0: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
9bf0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72  _tlv_entity *cur
9c00: 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20  r_entity, *root 
9c10: 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20  = NULL, *last = 
9c20: 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20  NULL;..unsigned 
9c30: 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d  char tlen_buf[2]
9c40: 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d  , tval_buf[1024]
9c50: 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e  , *tval;..unsign
9c60: 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66  ed char vlen_buf
9c70: 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31  [2], vval_buf[81
9c80: 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73  92], *vval;..uns
9c90: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62  igned char *tmpb
9ca0: 75 66 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65  uf;..ssize_t tle
9cb0: 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f  n, vlen;..ssize_
9cc0: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a  t read_ret;..siz
9cd0: 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30  e_t offset_t = 0
9ce0: 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a  , offset_v = 0;.
9cf0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
9d00: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67  ag;..size_t leng
9d10: 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  th;.#ifdef HAVE_
9d20: 4c 49 42 5a 0a 09 75 4c 6f 6e 67 66 20 74 6d 70  LIBZ..uLongf tmp
9d30: 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20 75 6e 63  buflen;..int unc
9d40: 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e  ompress_ret;.#en
9d50: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
9d60: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
9d70: 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74  d.");...read_ret
9d80: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
9d90: 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e  uffer(slot, tlen
9da0: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65  _buf, sizeof(tle
9db0: 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65  n_buf), 1, offse
9dc0: 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_t);..if (read_
9dd0: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c  ret != sizeof(tl
9de0: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
9df0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9e00: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
9e10: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
9e20: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
9e30: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65  (NULL);..}...tle
9e40: 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d  n = (tlen_buf[1]
9e50: 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75   << 8) | tlen_bu
9e60: 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74  f[0];...read_ret
9e70: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
9e80: 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e  uffer(slot, vlen
9e90: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65  _buf, sizeof(vle
9ea0: 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65  n_buf), 2, offse
9eb0: 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_v);..if (read_
9ec0: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c  ret != sizeof(vl
9ed0: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
9ee0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9ef0: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
9f00: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
9f10: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
9f20: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65  (NULL);..}...vle
9f30: 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d  n = (vlen_buf[1]
9f40: 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75   << 8) | vlen_bu
9f50: 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  f[0];...CACKEY_D
9f60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
9f70: 20 4c 65 6e 67 74 68 20 3d 20 25 69 2c 20 56 61   Length = %i, Va
9f80: 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 69 22  lue Length = %i"
9f90: 2c 20 74 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a  , tlen, vlen);..
9fa0: 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a  .offset_t += 2;.
9fb0: 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a  .offset_v += 2;.
9fc0: 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a  ..if (tlen > siz
9fd0: 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b  eof(tval_buf)) {
9fe0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9ff0: 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67  PRINTF("Tag leng
a000: 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c  th is too large,
a010: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
a020: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
a030: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
a040: 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66  f (vlen > sizeof
a050: 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09  (vval_buf)) {...
a060: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a070: 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74  NTF("Value lengt
a080: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
a090: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
a0a0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
a0b0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
a0c0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
a0d0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
a0e0: 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e  , tval_buf, tlen
a0f0: 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a  , 1, offset_t);.
a100: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
a110: 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   tlen) {...CACKE
a120: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a130: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
a140: 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20  ntire T-buffer, 
a150: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
a160: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
a170: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
a180: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
a190: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
a1a0: 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e  , vval_buf, vlen
a1b0: 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a  , 2, offset_v);.
a1c0: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
a1d0: 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   vlen) {...CACKE
a1e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a1f0: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
a200: 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20  ntire V-buffer, 
a210: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
a220: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
a230: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76  n(NULL);..}...tv
a240: 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09  al = tval_buf;..
a250: 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b  vval = vval_buf;
a260: 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20  ..while (tlen > 
a270: 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b  0 && vlen > 0) {
a280: 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a  ...tag = *tval;.
a290: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e  ..tval++;...tlen
a2a0: 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c  --;....if (*tval
a2b0: 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c   == 0xff) {....l
a2c0: 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d  ength = (tval[2]
a2d0: 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d   << 8) | tval[1]
a2e0: 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a  ;....tval += 3;.
a2f0: 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09  ...tlen -= 3;...
a300: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67  } else {....leng
a310: 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74  th = *tval;....t
a320: 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d  val++;....tlen--
a330: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
a340: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
a350: 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43  g: %s (%02x)", C
a360: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
a370: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29  _TAG_TO_STR(tag)
a380: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
a390: 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f   tag);...CACKEY_
a3a0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
a3b0: 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c  Value:", vval, l
a3c0: 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f  ength);....curr_
a3d0: 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
a3e0: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
a3f0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
a400: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63  G_CARDURL:.....c
a410: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
a420: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
a430: 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63  _entity));.....c
a440: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
a450: 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c  e_cardurl = mall
a460: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
a470: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
a480: 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65  rdurl));......me
a490: 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79  mcpy(curr_entity
a4a0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
a4b0: 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a  >rid, vval, 5);.
a4c0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
a4d0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
a4e0: 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35  apptype = vval[5
a4f0: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
a500: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
a510: 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76  l->objectid = (v
a520: 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76  val[6] << 8) | v
a530: 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72  val[7];.....curr
a540: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
a550: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20  ardurl->appid = 
a560: 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c  (vval[8] << 8) |
a570: 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63   vval[9];......c
a580: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
a590: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
a5a0: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
a5b0: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
a5c0: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
a5d0: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
a5e0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
a5f0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
a600: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09  curr_entity));..
a610: 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
a620: 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  oc(length);.....
a630: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
a640: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
a650: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
a660: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
a670: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e  curr_entity->len
a680: 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  gth = length;...
a690: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
a6a0: 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09  alue = tmpbuf;..
a6b0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a6c0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
a6d0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
a6e0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
a6f0: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72  IFICATE:.....cur
a700: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
a710: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
a720: 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 74 6d  ntity));......tm
a730: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
a740: 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66   * 2;.....tmpbuf
a750: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
a760: 6c 65 6e 29 3b 0a 0a 23 69 66 64 65 66 20 48 41  len);..#ifdef HA
a770: 56 45 5f 4c 49 42 5a 0a 09 09 09 09 75 6e 63 6f  VE_LIBZ.....unco
a780: 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63  mpress_ret = unc
a790: 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20  ompress(tmpbuf, 
a7a0: 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c  &tmpbuflen, vval
a7b0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69  , length);.....i
a7c0: 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
a7d0: 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09  t != Z_OK) {....
a7e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a7f0: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
a800: 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63   decompress, unc
a810: 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e  ompress() return
a820: 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69  ed %i -- resorti
a830: 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70  ng to direct cop
a840: 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  y", uncompress_r
a850: 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75  et);.......tmpbu
a860: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  flen = length;..
a870: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
a880: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
a890: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
a8a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
a8b0: 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64  UF("Decompressed
a8c0: 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74   to:", tmpbuf, t
a8d0: 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65  mpbuflen);.#else
a8e0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a8f0: 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e  G_PRINTF("Missin
a900: 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20  g ZLIB Support, 
a910: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65  this certificate
a920: 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65   is likely usele
a930: 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d  ss...");......tm
a940: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
a950: 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ;.....memcpy(tmp
a960: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
a970: 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09  h);.#endif......
a980: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
a990: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
a9a0: 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20  _entity->length 
a9b0: 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09  = tmpbuflen;....
a9c0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
a9d0: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
a9e0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
a9f0: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
aa00: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
aa10: 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31   GSCIS_TAG_PKCS1
aa20: 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  5:.....curr_enti
aa30: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
aa40: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
aa50: 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  );......curr_ent
aa60: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
aa70: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
aa80: 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76  >value_byte = vv
aa90: 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[0];.....curr_
aaa0: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
aab0: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
aac0: 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d  ;...}....vval +=
aad0: 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20   length;...vlen 
aae0: 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66  -= length;....if
aaf0: 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d   (curr_entity !=
ab00: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
ab10: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  root == NULL) {.
ab20: 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f  ....root = curr_
ab30: 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09  entity;....}....
ab40: 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c  .if (last != NUL
ab50: 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f  L) {.....last->_
ab60: 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  next = curr_enti
ab70: 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73  ty;....}.....las
ab80: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
ab90: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ...}..}...return
aba0: 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  (root);.}../*. *
abb0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
abc0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
abd0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
abe0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
abf0: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
ac00: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
ac10: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
ac20: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
ac30: 72 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74  ree_certs(struct
ac40: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
ac50: 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69  ntity *start, si
ac60: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20  ze_t count, int 
ac70: 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73  free_start) {..s
ac80: 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 66 6f 72  ize_t idx;...for
ac90: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
aca0: 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b   count; idx++) {
acb0: 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78  ...if (start[idx
acc0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b  ].certificate) {
acd0: 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69  ....free(start[i
ace0: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29  dx].certificate)
acf0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66  ;...}..}...if (f
ad00: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66  ree_start) {...f
ad10: 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a  ree(start);..}..
ad20: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
ad30: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
ad40: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
ad50: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
ad60: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
ad70: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
ad80: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
ad90: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
ada0: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
adb0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
adc0: 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72  *cackey_read_cer
add0: 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ts(struct cackey
ade0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
adf0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
ae00: 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c  identity *certs,
ae10: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
ae20: 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74  count) {..struct
ae30: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
ae40: 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a  ntity *curr_id;.
ae50: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
ae60: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74  lv_entity *ccc_t
ae70: 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a  lv, *ccc_curr, *
ae80: 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75  app_tlv, *app_cu
ae90: 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  rr;..unsigned ch
aea0: 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b  ar ccc_aid[] = {
aeb0: 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a  GSCIS_AID_CCC};.
aec0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
aed0: 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73  urr_aid[7];..uns
aee0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64  igned long outid
aef0: 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 72  x = 0;..cackey_r
af00: 65 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72  et transaction_r
af10: 65 74 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72  et;..int certs_r
af20: 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73  esizable;..int s
af30: 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f  end_ret, select_
af40: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
af50: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
af60: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75  ed.");...if (cou
af70: 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
af80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
af90: 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55  NTF("count is NU
afa0: 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  LL, returning in
afb0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
afc0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
afd0: 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e  ..if (certs != N
afe0: 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f  ULL) {...if (*co
aff0: 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43  unt == 0) {....C
b000: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b010: 54 46 28 22 52 65 71 75 65 73 74 65 64 20 77 65  TF("Requested we
b020: 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74   return 0 object
b030: 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  s, short-circuit
b040: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  ");.....return(c
b050: 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  erts);...}..}...
b060: 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74  /* Begin a Smart
b070: 43 61 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  Card transaction
b080: 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e   */..transaction
b090: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65  _ret = cackey_be
b0a0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
b0b0: 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e  slot);..if (tran
b0c0: 73 61 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43  saction_ret != C
b0d0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
b0e0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
b0f0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
b100: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
b110: 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  on, returning in
b120: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
b130: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
b140: 0a 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
b150: 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ULL) {...certs =
b160: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
b170: 63 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a  certs) * 5);...*
b180: 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72  count = 5;...cer
b190: 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31  ts_resizable = 1
b1a0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65  ;..} else {...ce
b1b0: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20  rts_resizable = 
b1c0: 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63  0;..}.../* Selec
b1d0: 74 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74  t the CCC Applet
b1e0: 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
b1f0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
b200: 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61  plet(slot, ccc_a
b210: 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61  id, sizeof(ccc_a
b220: 69 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  id));..if (send_
b230: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
b240: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
b250: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b260: 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65  ("Unable to sele
b270: 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72  ct CCC Applet, r
b280: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
b290: 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20 54 65 72  ure");..../* Ter
b2a0: 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64  minate SmartCard
b2b0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b2c0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
b2d0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
b2e0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
b2f0: 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64 20 61 6c  ..}.../* Read al
b300: 6c 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72  l the applets fr
b310: 6f 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56  om the CCC's TLV
b320: 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20 3d 20 63   */..ccc_tlv = c
b330: 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73  ackey_read_tlv(s
b340: 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20  lot);.../* Look 
b350: 66 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68 61  for CARDURLs tha
b360: 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20  t coorespond to 
b370: 50 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09  PKI applets */..
b380: 66 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20  for (ccc_curr = 
b390: 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72  ccc_tlv; ccc_cur
b3a0: 72 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63  r; ccc_curr = cc
b3b0: 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  c_curr->_next) {
b3c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b3d0: 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61  PRINTF("Found ta
b3e0: 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43  g: %s ... ", CAC
b3f0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54  KEY_DEBUG_FUNC_T
b400: 41 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  AG_TO_STR(ccc_cu
b410: 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 69 66  rr->tag));....if
b420: 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20   (ccc_curr->tag 
b430: 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  != GSCIS_TAG_CAR
b440: 44 55 52 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  DURL) {....CACKE
b450: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b460: 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
b470: 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
b480: 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22  about CARDURLs)"
b490: 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
b4a0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 63 63 63  ...}....if ((ccc
b4b0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b4c0: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20  durl->apptype & 
b4d0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
b4e0: 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c  KI) != CACKEY_TL
b4f0: 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09  V_APP_PKI) {....
b500: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b510: 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
b520: 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
b530: 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61  care about PKI a
b540: 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70  pplets, this app
b550: 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73  let supports: %s
b560: 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  /%02x)", CACKEY_
b570: 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59  DEBUG_FUNC_APPTY
b580: 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  PE_TO_STR(ccc_cu
b590: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b5a0: 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e  l->apptype), (un
b5b0: 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f  signed int) ccc_
b5c0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
b5d0: 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a  url->apptype);..
b5e0: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
b5f0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b600: 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22  _PRINTBUF("RID:"
b610: 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
b620: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
b630: 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
b640: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
b650: 72 69 64 29 29 3b 0a 09 09 43 41 43 4b 45 59 5f  rid));...CACKEY_
b660: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70  DEBUG_PRINTF("Ap
b670: 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c  pID = %s/%04lx",
b680: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
b690: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
b6a0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
b6b0: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c  cardurl->appid),
b6c0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b6d0: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
b6e0: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29  _cardurl->appid)
b6f0: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
b700: 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49  _PRINTF("ObjectI
b710: 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43  D = %s/%04lx", C
b720: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
b730: 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63  _OBJID_TO_STR(cc
b740: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
b750: 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
b760: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b770: 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
b780: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
b790: 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28  tid);....memcpy(
b7a0: 63 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75  curr_aid, ccc_cu
b7b0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b7c0: 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
b7d0: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
b7e0: 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
b7f0: 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66  .curr_aid[sizeof
b800: 28 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d 20  (curr_aid) - 2] 
b810: 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  = (ccc_curr->val
b820: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
b830: 64 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  d >> 8) & 0xff;.
b840: 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f  ..curr_aid[sizeo
b850: 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31 5d  f(curr_aid) - 1]
b860: 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   = ccc_curr->val
b870: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
b880: 64 20 26 20 30 78 66 66 3b 0a 0a 09 09 2f 2a 20  d & 0xff;..../* 
b890: 53 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70  Select found app
b8a0: 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 73 65 6c  let ... */...sel
b8b0: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
b8c0: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
b8d0: 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73  lot, curr_aid, s
b8e0: 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29  izeof(curr_aid))
b8f0: 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72  ;...if (select_r
b900: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
b910: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
b920: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b930: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65  ("Failed to sele
b940: 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70  ct applet, skipp
b950: 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
b960: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
b970: 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
b980: 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64  .}..../* ... and
b990: 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a   object (file) *
b9a0: 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  /...select_ret =
b9b0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
b9c0: 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75  ile(slot, ccc_cu
b9d0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b9e0: 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09  l->objectid);...
b9f0: 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21  if (select_ret !
ba00: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
ba10: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
ba20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
ba30: 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66  iled to select f
ba40: 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72  ile, skipping pr
ba50: 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73  ocessing of this
ba60: 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63   object");.....c
ba70: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
ba80: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20  /* Process this 
ba90: 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69  file's TLV looki
baa0: 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61  ng for certifica
bab0: 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f 74 6c 76  tes */...app_tlv
bac0: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
bad0: 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 66 6f 72  lv(slot);....for
bae0: 20 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70   (app_curr = app
baf0: 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b 20  _tlv; app_curr; 
bb00: 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 63  app_curr = app_c
bb10: 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
bb20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bb30: 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
bb40: 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
bb50: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
bb60: 54 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67  TR(app_curr->tag
bb70: 29 29 3b 0a 09 09 09 69 66 20 28 61 70 70 5f 63  ));....if (app_c
bb80: 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49  urr->tag != GSCI
bb90: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
bba0: 45 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  E) {.....CACKEY_
bbb0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
bbc0: 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
bbd0: 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
bbe0: 6f 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73  out CERTIFICATEs
bbf0: 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e  )");......contin
bc00: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
bc10: 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
bc20: 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
bc30: 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ++;.....memcpy(c
bc40: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
bc50: 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66  curr_aid, sizeof
bc60: 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74  (curr_id->applet
bc70: 29 29 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  ));....curr_id->
bc80: 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d  file = ccc_curr-
bc90: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
bca0: 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 63 75 72  objectid;....cur
bcb0: 72 5f 69 64 2d 3e 6c 61 62 65 6c 20 3d 20 4e 55  r_id->label = NU
bcc0: 4c 4c 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  LL;....curr_id->
bcd0: 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09  keysize = -1;...
bce0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bcf0: 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63  RINTF("Filling c
bd00: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 20 28  urr_id->applet (
bd10: 25 70 29 20 77 69 74 68 20 25 6c 75 20 62 79 74  %p) with %lu byt
bd20: 65 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61  es:", curr_id->a
bd30: 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 64  pplet, (unsigned
bd40: 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 75   long) sizeof(cu
bd50: 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b  rr_id->applet));
bd60: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
bd70: 5f 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22  _PRINTBUF("VAL:"
bd80: 2c 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  , curr_id->apple
bd90: 74 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69  t, sizeof(curr_i
bda0: 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09  d->applet));....
bdb0: 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
bdc0: 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f  icate_len = app_
bdd0: 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09  curr->length;...
bde0: 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
bdf0: 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
be00: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
be10: 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65  cate_len);....me
be20: 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65  mcpy(curr_id->ce
be30: 72 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63  rtificate, app_c
be40: 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72  urr->value, curr
be50: 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
be60: 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 6f  _len);.....if (o
be70: 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
be80: 20 7b 0a 09 09 09 09 69 66 20 28 63 65 72 74 73   {.....if (certs
be90: 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09  _resizable) {...
bea0: 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a  ...*count *= 2;.
beb0: 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 65 61  .....certs = rea
bec0: 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65  lloc(certs, size
bed0: 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63  of(*certs) * (*c
bee0: 6f 75 6e 74 29 29 3b 0a 09 09 09 09 7d 20 65 6c  ount));.....} el
bef0: 73 65 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b  se {......break;
bf00: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a  .....}....}...}.
bf10: 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74  ...cackey_free_t
bf20: 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09  lv(app_tlv);....
bf30: 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
bf40: 6f 75 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b  ount) {....break
bf50: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65  ;...}..}...cacke
bf60: 79 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74  y_free_tlv(ccc_t
bf70: 6c 76 29 3b 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20  lv);...*count = 
bf80: 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65  outidx;...if (ce
bf90: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b  rts_resizable) {
bfa0: 0a 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
bfb0: 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
bfc0: 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
bfd0: 6e 74 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 65  nt));..}.../* Te
bfe0: 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72  rminate SmartCar
bff0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
c000: 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
c010: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
c020: 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b  ..return(certs);
c030: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
c040: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
c050: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
c060: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
c070: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
c080: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
c090: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
c0a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a  . */.static ssiz
c0b0: 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  e_t cackey_signd
c0c0: 65 63 72 79 70 74 28 73 74 72 75 63 74 20 63 61  ecrypt(struct ca
c0d0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
c0e0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69   struct cackey_i
c0f0: 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
c100: 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  y, unsigned char
c110: 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75   *buf, size_t bu
c120: 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63  flen, unsigned c
c130: 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a  har *outbuf, siz
c140: 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e 29 20 7b  e_t outbuflen) {
c150: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
c160: 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75 66  *tmpbuf, *tmpbuf
c170: 5f 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  _s;..unsigned ch
c180: 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  ar bytes_to_send
c190: 2c 20 70 31 3b 0a 09 63 61 63 6b 65 79 5f 72 65  , p1;..cackey_re
c1a0: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e  t send_ret;..uin
c1b0: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
c1c0: 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65  .size_t tmpbufle
c1d0: 6e 2c 20 70 61 64 6c 65 6e 3b 0a 09 69 6e 74 20  n, padlen;..int 
c1e0: 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
c1f0: 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b  ..int le;...CACK
c200: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c210: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
c220: 20 28 62 75 66 6c 65 6e 20 3e 20 32 35 35 29 20   (buflen > 255) 
c230: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c240: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
c250: 20 62 75 66 6c 65 6e 20 69 73 20 67 72 65 61 74   buflen is great
c260: 65 72 20 74 68 61 6e 20 32 35 35 20 28 62 75 66  er than 255 (buf
c270: 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e  len = %lu)", (un
c280: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66  signed long) buf
c290: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
c2a0: 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75  -1);..}...if (ou
c2b0: 74 62 75 66 6c 65 6e 20 3e 20 32 35 33 29 20 7b  tbuflen > 253) {
c2c0: 0a 09 09 6c 65 20 3d 20 32 35 33 3b 0a 09 7d 20  ...le = 253;..} 
c2d0: 65 6c 73 65 20 7b 0a 09 09 6c 65 20 3d 20 6f 75  else {...le = ou
c2e0: 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66  tbuflen;..}...if
c2f0: 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (slot == NULL) 
c300: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c310: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
c320: 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b   slot is NULL");
c330: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
c340: 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20  .}...if (buf == 
c350: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
c360: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
c370: 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55  rror.  buf is NU
c380: 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
c390: 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75  -1);..}...if (ou
c3a0: 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tbuf == NULL) {.
c3b0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c3c0: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f  RINTF("Error.  o
c3d0: 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b  utbuf is NULL");
c3e0: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
c3f0: 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  .}...if (identit
c400: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
c410: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c420: 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
c430: 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tity is NULL");.
c440: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c450: 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  }...if (identity
c460: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
c470: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
c480: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c490: 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
c4a0: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
c4b0: 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  y is NULL");....
c4c0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
c4d0: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 64  ./* Determine id
c4e0: 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65 20  entity Key size 
c4f0: 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  */..if (identity
c500: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
c510: 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a  >keysize < 0) {.
c520: 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  ..identity->pcsc
c530: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
c540: 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79  ze = x509_to_key
c550: 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e 70  size(identity->p
c560: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
c570: 72 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e 74  rtificate, ident
c580: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
c590: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
c5a0: 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61  len);..}.../* Pa
c5b0: 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 79  d message to key
c5c0: 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64   size */..if (id
c5d0: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
c5e0: 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e  ntity->keysize >
c5f0: 20 30 29 20 7b 0a 09 09 69 66 20 28 62 75 66 6c   0) {...if (bufl
c600: 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e  en != identity->
c610: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
c620: 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 69 66 20  eysize) {....if 
c630: 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74  (buflen > (ident
c640: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
c650: 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29  ty->keysize + 3)
c660: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
c670: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
c680: 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20  or.  Message is 
c690: 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67  too large to sig
c6a0: 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09  n/decrypt");....
c6b0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
c6c0: 09 7d 0a 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e  .}.....tmpbuflen
c6d0: 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73   = identity->pcs
c6e0: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
c6f0: 69 7a 65 3b 0a 09 09 09 74 6d 70 62 75 66 20 3d  ize;....tmpbuf =
c700: 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
c710: 6e 29 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62  n);....free_tmpb
c720: 75 66 20 3d 20 31 3b 0a 0a 09 09 09 70 61 64 6c  uf = 1;.....padl
c730: 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d  en = tmpbuflen -
c740: 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09   buflen - 3;....
c750: 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30  .tmpbuf[0] = 0x0
c760: 30 3b 0a 09 09 09 74 6d 70 62 75 66 5b 31 5d 20  0;....tmpbuf[1] 
c770: 3d 20 30 78 30 31 3b 0a 09 09 09 6d 65 6d 73 65  = 0x01;....memse
c780: 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78  t(&tmpbuf[2], 0x
c790: 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09  FF, padlen);....
c7a0: 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20  tmpbuf[padlen + 
c7b0: 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 6d 65 6d  2]= 0x00;....mem
c7c0: 63 70 79 28 26 74 6d 70 62 75 66 5b 70 61 64 6c  cpy(&tmpbuf[padl
c7d0: 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75  en + 3], buf, bu
c7e0: 66 6c 65 6e 29 3b 0a 0a 09 09 09 43 41 43 4b 45  flen);.....CACKE
c7f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
c800: 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75  ("Unpadded:", bu
c810: 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 43  f, buflen);....C
c820: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c830: 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20  TBUF("Padded:", 
c840: 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65  tmpbuf, tmpbufle
c850: 6e 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  n);...} else {..
c860: 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a  ..tmpbuf = buf;.
c870: 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62  ...tmpbuflen = b
c880: 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74  uflen;....free_t
c890: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 61  mpbuf = 0;....pa
c8a0: 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  dlen = 0;...}..}
c8b0: 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59   else {...CACKEY
c8c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
c8d0: 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  nable to determi
c8e0: 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70  ne key size, hop
c8f0: 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65 20  ing the message 
c900: 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64  is properly padd
c910: 65 64 21 22 29 3b 0a 0a 09 09 74 6d 70 62 75 66  ed!");....tmpbuf
c920: 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 66   = buf;...tmpbuf
c930: 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
c940: 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
c950: 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
c960: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 61  }.../* Begin tra
c970: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
c980: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
c990: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f  ction(slot);.../
c9a0: 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
c9b0: 20 61 70 70 6c 65 74 20 2a 2f 0a 09 43 41 43 4b   applet */..CACK
c9c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c9d0: 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65  "Selecting apple
c9e0: 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e  t found at %p ..
c9f0: 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  .", identity->pc
ca00: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70  sc_identity->app
ca10: 6c 65 74 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65  let);..cackey_se
ca20: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
ca30: 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
ca40: 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65  _identity->apple
ca50: 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69  t, sizeof(identi
ca60: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
ca70: 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 2f  y->applet));.../
ca80: 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
ca90: 20 66 69 6c 65 20 2a 2f 0a 09 63 61 63 6b 65 79   file */..cackey
caa0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f  _select_file(slo
cab0: 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  t, identity->pcs
cac0: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c 65  c_identity->file
cad0: 29 3b 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20  );...tmpbuf_s = 
cae0: 74 6d 70 62 75 66 3b 0a 09 77 68 69 6c 65 20 28  tmpbuf;..while (
caf0: 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 69  tmpbuflen) {...i
cb00: 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 32  f (tmpbuflen > 2
cb10: 34 35 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  45) {....bytes_t
cb20: 6f 5f 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09 09  o_send = 245;...
cb30: 09 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 7d 20  .p1 = 0x80;...} 
cb40: 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73 5f  else {....bytes_
cb50: 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 66  to_send = tmpbuf
cb60: 6c 65 6e 3b 0a 09 09 09 70 31 20 3d 20 30 78 30  len;....p1 = 0x0
cb70: 30 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 5f 72  0;...}....send_r
cb80: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
cb90: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
cba0: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
cbb0: 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49  LATFORM, GSCIS_I
cbc0: 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54  NSTR_SIGNDECRYPT
cbd0: 2c 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65  , p1, 0x00, byte
cbe0: 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75  s_to_send, tmpbu
cbf0: 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65  f, le, &respcode
cc00: 2c 20 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75  , outbuf, &outbu
cc10: 66 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73 65 6e  flen);...if (sen
cc20: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
cc30: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
cc40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
cc50: 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
cc60: 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 75  g Failed -- retu
cc70: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
cc80: 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70 63  );.....if (respc
cc90: 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 29 20 7b  ode == 0x6982) {
cca0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
ccb0: 47 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72 69  G_PRINTF("Securi
ccc0: 74 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73 61  ty status not sa
ccd0: 74 69 73 69 66 69 65 64 2e 22 29 3b 0a 09 09 09  tisified.");....
cce0: 7d 0a 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74  }.....if (free_t
ccf0: 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20  mpbuf) {.....if 
cd00: 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09  (tmpbuf_s) {....
cd10: 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29  ..free(tmpbuf_s)
cd20: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
cd30: 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74  ./* End transact
cd40: 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
cd50: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
cd60: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75  (slot);.....retu
cd70: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74  rn(-1);...}....t
cd80: 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74  mpbuf += bytes_t
cd90: 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66  o_send;...tmpbuf
cda0: 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f  len -= bytes_to_
cdb0: 73 65 6e 64 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  send;..}...if (f
cdc0: 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
cdd0: 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
cde0: 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
cdf0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 45  );...}..}.../* E
ce00: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nd transaction *
ce10: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
ce20: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
ce30: 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
ce40: 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
ce50: 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
ce60: 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c 65  AX..if (outbufle
ce70: 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  n > _POSIX_SSIZE
ce80: 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59  _MAX) {...CACKEY
ce90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
cea0: 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64 73  utbuflen exceeds
ceb0: 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
cec0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ced0: 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
cee0: 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c  , outbuflen = %l
cef0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
cf00: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
cf10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75  nsigned long) ou
cf20: 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74  tbuflen);....ret
cf30: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
cf40: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ndif.#endif...CA
cf50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cf60: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
cf70: 73 75 63 63 65 73 73 2e 22 29 3b 0a 0a 09 72 65  success.");...re
cf80: 74 75 72 6e 28 6f 75 74 62 75 66 6c 65 6e 29 3b  turn(outbuflen);
cf90: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
cfa0: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
cfb0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
cfc0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
cfd0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
cfe0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
cff0: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
d000: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
d010: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f  ey_ret cackey_lo
d020: 67 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  gin(struct cacke
d030: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
d040: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e  signed char *pin
d050: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
d060: 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72  pin_len, int *tr
d070: 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
d080: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
d090: 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b  r cac_pin[8] = {
d0a0: 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
d0b0: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
d0c0: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b  FF, 0xFF, 0xFF};
d0d0: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f  ..uint16_t respo
d0e0: 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74  nse_code;..int t
d0f0: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
d100: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
d110: 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  ./* Indicate tha
d120: 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  t we do not know
d130: 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20   about how many 
d140: 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e  tries are remain
d150: 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65  ing */..if (trie
d160: 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
d170: 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
d180: 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a  ing_p = -1;..}..
d190: 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20  ./* Apparently, 
d1a0: 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58  CAC PINs are *EX
d1b0: 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c  ACTLY* 8 bytes l
d1c0: 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20  ong -- pad with 
d1d0: 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72  0xFF if too shor
d1e0: 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65  t */..if (pin_le
d1f0: 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63  n >= 8) {...memc
d200: 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
d210: 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   8);..} else {..
d220: 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c  .memcpy(cac_pin,
d230: 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a   pin, pin_len);.
d240: 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49  .}.../* Issue PI
d250: 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e  N Verify */..sen
d260: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
d270: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
d280: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
d290: 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  16, GSCIS_INSTR_
d2a0: 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20 30 78  VERIFY, 0x00, 0x
d2b0: 30 30 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70  00, sizeof(cac_p
d2c0: 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78  in), cac_pin, 0x
d2d0: 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f  00, &response_co
d2e0: 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  de, NULL, NULL);
d2f0: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
d300: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
d310: 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73  OK) {...if ((res
d320: 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36  ponse_code & 0x6
d330: 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20  3C0) == 0x63C0) 
d340: 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69  {....tries_remai
d350: 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65  ning = (response
d360: 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09  _code & 0xF);...
d370: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d380: 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
d390: 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20  ication failed, 
d3a0: 25 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69  %i tries remaini
d3b0: 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69  ng", tries_remai
d3c0: 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74  ning);.....if (t
d3d0: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
d3e0: 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72  ) {.....*tries_r
d3f0: 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69  emaining_p = tri
d400: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09  es_remaining;...
d410: 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  .}.....return(CA
d420: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
d430: 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  IN);...}....if (
d440: 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d  response_code ==
d450: 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41   0x6983) {....CA
d460: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d470: 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
d480: 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69  ion failed, devi
d490: 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a  ce is locked");.
d4a0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
d4b0: 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29  Y_PCSC_E_LOCKED)
d4c0: 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  ;...}....return(
d4d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
d4e0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
d4f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d500: 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
d510: 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a  on succeeded");.
d520: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
d530: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
d540: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
d550: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
d560: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
d570: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
d580: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
d590: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
d5a0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
d5b0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
d5c0: 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70  t cackey_token_p
d5d0: 72 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61  resent(struct ca
d5e0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
d5f0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
d600: 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47  r ccc_aid[] = {G
d610: 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09  SCIS_AID_CCC};..
d620: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
d630: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43 43  /* Select the CC
d640: 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e  C Applet */..sen
d650: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
d660: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
d670: 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65  t, ccc_aid, size
d680: 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69  of(ccc_aid));..i
d690: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
d6a0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
d6b0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
d6c0: 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41  EY_PCSC_S_TOKENA
d6d0: 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 72 65 74  BSENT);..}...ret
d6e0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
d6f0: 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b  S_TOKENPRESENT);
d700: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
d710: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
d720: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
d730: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
d740: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
d750: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
d760: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
d770: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a  . */.static ssiz
d780: 65 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  e_t cackey_pcsc_
d790: 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65  identity_to_labe
d7a0: 6c 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  l(struct cackey_
d7b0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69  pcsc_identity *i
d7c0: 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
d7d0: 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75  d char *label_bu
d7e0: 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  f, unsigned long
d7f0: 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20   label_buf_len) 
d800: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
d810: 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
d820: 3b 0a 09 63 68 61 72 20 2a 6c 61 62 65 6c 5f 61  ;..char *label_a
d830: 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74  sn1;..void *cert
d840: 69 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35  ificate;..int x5
d850: 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63  09_read_ret;...c
d860: 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65  ertificate = ide
d870: 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
d880: 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65  te;..certificate
d890: 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  _len = identity-
d8a0: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
d8b0: 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63  ;...if (certific
d8c0: 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09  ate_len < 0) {..
d8d0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
d8e0: 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
d8f0: 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63  = x509_to_subjec
d900: 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
d910: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
d920: 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c  (void **) &label
d930: 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30  _asn1);..if (x50
d940: 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
d950: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  {...return(-1);.
d960: 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72  .}...x509_read_r
d970: 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f  et = x509_dn_to_
d980: 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e  string(label_asn
d990: 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
d9a0: 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c  , (char *) label
d9b0: 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f  _buf, label_buf_
d9c0: 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20  len, "CN");..if 
d9d0: 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
d9e0: 3d 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65  = 0) {...x509_re
d9f0: 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e  ad_ret = x509_dn
da00: 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c  _to_string(label
da10: 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64  _asn1, x509_read
da20: 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c  _ret, (char *) l
da30: 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f  abel_buf, label_
da40: 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a  buf_len, NULL);.
da50: 0a 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
da60: 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09  _ret <= 0) {....
da70: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
da80: 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
da90: 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
daa0: 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
dab0: 5f 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72  _MAX..if (x509_r
dac0: 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58  ead_ret > _POSIX
dad0: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
dae0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
daf0: 4e 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72  NTF("x509_read_r
db00: 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d  et exceeds maxim
db10: 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e  um value, return
db20: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20  ing in failure. 
db30: 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39  (max = %li, x509
db40: 5f 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29  _read_ret = %lu)
db50: 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58  ", (long) _POSIX
db60: 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73  _SSIZE_MAX, (uns
db70: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39  igned long) x509
db80: 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72  _read_ret);....r
db90: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
dba0: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
dbb0: 72 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64  return(x509_read
dbc0: 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  _ret);.}../* Ret
dbd0: 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
dbe0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
dbf0: 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65  cackey_mutex_cre
dc00: 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78  ate(void **mutex
dc10: 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
dc20: 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
dc30: 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
dc40: 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
dc50: 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
dc60: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dc70: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
dc80: 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
dc90: 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
dca0: 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
dcb0: 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
dcc0: 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
dcd0: 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63  d_mutex = malloc
dce0: 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64  (sizeof(*pthread
dcf0: 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28  _mutex));...if (
dd00: 21 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20  !pthread_mutex) 
dd10: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
dd20: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
dd30: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
dd40: 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  ory.");.....retu
dd50: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70  rn(-1);...}....p
dd60: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20  thread_retval = 
dd70: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
dd80: 69 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  it(pthread_mutex
dd90: 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70  , NULL);...if (p
dda0: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d  thread_retval !=
ddb0: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
ddc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74  DEBUG_PRINTF("pt
ddd0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
dde0: 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
ddf0: 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61  r (%i).", pthrea
de00: 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  d_retval);.....r
de10: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
de20: 09 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65  ..*mutex = pthre
de30: 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73  ad_mutex;..} els
de40: 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  e {...if (cackey
de50: 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
de60: 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
de70: 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
de80: 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28  rgs.CreateMutex(
de90: 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
dea0: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
deb0: 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
dec0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ded0: 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
dee0: 43 72 65 61 74 65 4d 75 74 65 78 28 29 20 72 65  CreateMutex() re
def0: 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c  turned error (%l
df00: 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73  i).", (long) cus
df10: 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  tom_retval);....
df20: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
df30: 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  .}...}..}...CACK
df40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
df50: 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73  "Returning suces
df60: 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09  sfully (0)");...
df70: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
df80: 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
df90: 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
dfa0: 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
dfb0: 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65  _lock(void *mute
dfc0: 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
dfd0: 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
dfe0: 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
dff0: 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
e000: 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
e010: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e020: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
e030: 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
e040: 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
e050: 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
e060: 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
e070: 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
e080: 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78  ad_mutex = mutex
e090: 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
e0a0: 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
e0b0: 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64  tex_lock(pthread
e0c0: 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70  _mutex);...if (p
e0d0: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d  thread_retval !=
e0e0: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
e0f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74  DEBUG_PRINTF("pt
e100: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
e110: 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
e120: 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61  r (%i).", pthrea
e130: 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  d_retval);.....r
e140: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
e150: 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63  } else {...if (c
e160: 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
e170: 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f  utex) {....custo
e180: 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  m_retval = cacke
e190: 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
e1a0: 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20  (mutex);.....if 
e1b0: 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21  (custom_retval !
e1c0: 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
e1d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e1e0: 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73  NTF("cackey_args
e1f0: 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74  .LockMutex() ret
e200: 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
e210: 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
e220: 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
e230: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
e240: 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
e250: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e260: 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
e270: 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
e280: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
e290: 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
e2a0: 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
e2b0: 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
e2c0: 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74  unlock(void *mut
e2d0: 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d  ex) {..pthread_m
e2e0: 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f  utex_t *pthread_
e2f0: 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72  mutex;..int pthr
e300: 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  ead_retval;..CK_
e310: 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  RV custom_retval
e320: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e330: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
e340: 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65  ");...if ((cacke
e350: 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43  y_args.flags & C
e360: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
e370: 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  ) == CKF_OS_LOCK
e380: 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72  ING_OK) {...pthr
e390: 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65  ead_mutex = mute
e3a0: 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  x;....pthread_re
e3b0: 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d  tval = pthread_m
e3c0: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72  utex_unlock(pthr
e3d0: 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66  ead_mutex);...if
e3e0: 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
e3f0: 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
e400: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e410: 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75  "pthread_mutex_u
e420: 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64  nlock() returned
e430: 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70   error (%i).", p
e440: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a  thread_retval);.
e450: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
e460: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
e470: 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  if (cackey_args.
e480: 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09  UnlockMutex) {..
e490: 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20  ..custom_retval 
e4a0: 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e  = cackey_args.Un
e4b0: 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29  lockMutex(mutex)
e4c0: 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d  ;.....if (custom
e4d0: 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f  _retval != CKR_O
e4e0: 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
e4f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
e500: 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
e510: 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64  Mutex() returned
e520: 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20   error (%li).", 
e530: 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65  (long) custom_re
e540: 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75  tval);......retu
e550: 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d  rn(-1);....}...}
e560: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
e570: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
e580: 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79  ning sucessfully
e590: 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e   (0)");...return
e5a0: 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43  (0);.}..static C
e5b0: 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
e5c0: 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
e5d0: 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f  butes(CK_OBJECT_
e5e0: 43 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73  CLASS objectclas
e5f0: 73 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  s, struct cackey
e600: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
e610: 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e  identity, unsign
e620: 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79  ed long identity
e630: 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  _num, CK_ULONG_P
e640: 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  TR pulCount) {..
e650: 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20  static CK_BBOOL 
e660: 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74  ck_true = 1;..st
e670: 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b  atic CK_BBOOL ck
e680: 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09 43 4b 5f  _false = 0;..CK_
e690: 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 20 3d  ULONG numattrs =
e6a0: 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74   0, retval_count
e6b0: 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ;..CK_ATTRIBUTE_
e6c0: 54 59 50 45 20 63 75 72 72 5f 61 74 74 72 5f 74  TYPE curr_attr_t
e6d0: 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  ype;..CK_ATTRIBU
e6e0: 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20 2a 72  TE curr_attr, *r
e6f0: 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f  etval;..CK_VOID_
e700: 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f  PTR pValue;..CK_
e710: 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e  ULONG ulValueLen
e720: 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41  ;..CK_OBJECT_CLA
e730: 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61  SS ck_object_cla
e740: 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 49 43  ss;..CK_CERTIFIC
e750: 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 72 74  ATE_TYPE ck_cert
e760: 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 43  ificate_type;..C
e770: 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f 6b 65  K_KEY_TYPE ck_ke
e780: 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 46 38  y_type;..CK_UTF8
e790: 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b 31 30  CHAR ucTmpBuf[10
e7a0: 32 34 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  24];..unsigned c
e7b0: 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65  har *certificate
e7c0: 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69  ;..ssize_t certi
e7d0: 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c  ficate_len = -1,
e7e0: 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
e7f0: 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65  .int pValue_free
e800: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e810: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20  _PRINTF("Called 
e820: 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25  (objectClass = %
e830: 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  lu, identity_num
e840: 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
e850: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63  gned long) objec
e860: 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79  tclass, identity
e870: 5f 6e 75 6d 29 3b 0a 0a 09 69 66 20 28 6f 62 6a  _num);...if (obj
e880: 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
e890: 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
e8a0: 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
e8b0: 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20  O_PUBLIC_KEY && 
e8c0: 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
e8d0: 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20  KO_PRIVATE_KEY) 
e8e0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
e8f0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
e900: 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55  ng 0 objects (NU
e910: 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a  LL), invalid obj
e920: 65 63 74 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09  ect class");....
e930: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
e940: 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 74 20 2a  .../* Get Cert *
e950: 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20  /..if (identity 
e960: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
e970: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e980: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
e990: 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e  jects (NULL), in
e9a0: 76 61 6c 69 64 20 69 64 65 6e 74 69 79 20 70 72  valid identiy pr
e9b0: 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 72 65 74  ovided");....ret
e9c0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
e9d0: 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64  certificate = id
e9e0: 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
e9f0: 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74  ate;..certificat
ea00: 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  e_len = identity
ea10: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
ea20: 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69  n;...if (certifi
ea30: 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c  cate_len == -1 |
ea40: 7c 20 63 65 72 74 69 66 69 63 61 74 65 20 3d 3d  | certificate ==
ea50: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
ea60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ea70: 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65  Returning 0 obje
ea80: 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73  cts (NULL), this
ea90: 20 69 64 65 6e 74 69 74 79 20 64 6f 65 73 20 6e   identity does n
eaa0: 6f 74 20 68 61 76 65 20 61 6e 20 58 2e 35 30 39  ot have an X.509
eab0: 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73   certificate ass
eac0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 74 20  ociated with it 
ead0: 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  and will not wor
eae0: 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  k");....return(N
eaf0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65  ULL);..}.../* Ve
eb00: 72 69 66 79 20 74 68 61 74 20 63 65 72 74 69 66  rify that certif
eb10: 69 63 61 74 65 20 69 73 20 41 53 4e 2e 31 20 65  icate is ASN.1 e
eb20: 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 63 65 72  ncoded X.509 cer
eb30: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20  tificate */..if 
eb40: 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28  (x509_to_serial(
eb50: 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
eb60: 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55  tificate_len, NU
eb70: 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 43 41 43  LL) < 0) {...CAC
eb80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
eb90: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
eba0: 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68  jects (NULL), th
ebb0: 65 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  e X.509 certific
ebc0: 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ate associated w
ebd0: 69 74 68 20 74 68 69 73 20 69 64 65 6e 74 69 74  ith this identit
ebe0: 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 22 29  y is not valid")
ebf0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
ec00: 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63  );..}...retval_c
ec10: 6f 75 6e 74 20 3d 20 31 36 3b 0a 09 72 65 74 76  ount = 16;..retv
ec20: 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76  al = malloc(retv
ec30: 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
ec40: 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66  f(*retval));...f
ec50: 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  or (curr_attr_ty
ec60: 70 65 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74  pe = 0; curr_att
ec70: 72 5f 74 79 70 65 20 3c 20 30 78 63 65 35 33 36  r_type < 0xce536
ec80: 33 35 66 3b 20 63 75 72 72 5f 61 74 74 72 5f 74  35f; curr_attr_t
ec90: 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  ype++) {...if (c
eca0: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d  urr_attr_type ==
ecb0: 20 30 78 38 30 30 29 20 7b 0a 09 09 09 63 75 72   0x800) {....cur
ecc0: 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 78  r_attr_type = 0x
ecd0: 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09  ce536300;...}...
ece0: 09 70 56 61 6c 75 65 5f 66 72 65 65 20 3d 20 30  .pValue_free = 0
ecf0: 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ;...pValue = NUL
ed00: 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  L;...ulValueLen 
ed10: 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
ed20: 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72 5f  ...switch (curr_
ed30: 61 74 74 72 5f 74 79 70 65 29 20 7b 0a 09 09 09  attr_type) {....
ed40: 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a  case CKA_CLASS:.
ed50: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ed60: 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
ed70: 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
ed80: 41 5f 43 4c 41 53 53 20 28 30 78 25 30 38 6c 78  A_CLASS (0x%08lx
ed90: 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
eda0: 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
edb0: 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b  r_type);......ck
edc0: 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20  _object_class = 
edd0: 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09  objectclass;....
ede0: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f  ..pValue = &ck_o
edf0: 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09  bject_class;....
ee00: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
ee10: 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63  zeof(ck_object_c
ee20: 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lass);......CACK
ee30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ee40: 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
ee50: 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
ee60: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
ee70: 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  ((CK_OBJECT_CLAS
ee80: 53 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  S *) pValue), pV
ee90: 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
eea0: 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
eeb0: 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
eec0: 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e  ..case CKA_TOKEN
eed0: 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
eee0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
eef0: 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
ef00: 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38  CKA_TOKEN (0x%08
ef10: 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
ef20: 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
ef30: 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
ef40: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
ef50: 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
ef60: 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
ef70: 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ue);......CACKEY
ef80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
ef90: 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
efa0: 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
efb0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
efc0: 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
efd0: 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
efe0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
eff0: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
f000: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
f010: 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09  A_MODIFIABLE:...
f020: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f030: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
f040: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
f050: 4d 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25 30  MODIFIABLE (0x%0
f060: 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
f070: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
f080: 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
f090: 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
f0a0: 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lse;.....ulValue
f0b0: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
f0c0: 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43  false);......CAC
f0d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f0e0: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
f0f0: 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
f100: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f110: 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
f120: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
f130: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f140: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
f150: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
f160: 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09   CKA_LABEL:.....
f170: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f180: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
f190: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41  attribute CKA_LA
f1a0: 42 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BEL (0x%08lx) ..
f1b0: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
f1c0: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
f1d0: 70 65 29 3b 0a 0a 09 09 09 09 2f 2a 20 44 65 74  pe);....../* Det
f1e0: 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09  ermine name */..
f1f0: 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
f200: 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69   = cackey_pcsc_i
f210: 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c  dentity_to_label
f220: 28 69 64 65 6e 74 69 74 79 2c 20 75 63 54 6d 70  (identity, ucTmp
f230: 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d  Buf, sizeof(ucTm
f240: 70 42 75 66 29 29 3b 0a 09 09 09 09 69 66 20 28  pBuf));.....if (
f250: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20  x509_read_ret > 
f260: 30 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  0) {......pValue
f270: 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a 09 09 09   = ucTmpBuf;....
f280: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
f290: 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
f2a0: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
f2b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
f2c0: 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
f2d0: 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
f2e0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f2f0: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
f300: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
f310: 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09   CKA_VALUE:.....
f320: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f330: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
f340: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41  attribute CKA_VA
f350: 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  LUE (0x%08lx) ..
f360: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
f370: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
f380: 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68  pe);......switch
f390: 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b   (objectclass) {
f3a0: 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50  ......case CKO_P
f3b0: 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09  RIVATE_KEY:.....
f3c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f3d0: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
f3e0: 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
f3f0: 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
f400: 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a  private key.");.
f410: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
f420: 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c  ...case CKO_PUBL
f430: 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 2f 2a  IC_KEY:......./*
f440: 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09   XXX: TODO */...
f450: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
f460: 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46  .case CKO_CERTIF
f470: 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61  ICATE:.......pVa
f480: 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61 74  lue = certificat
f490: 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65  e;.......ulValue
f4a0: 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74  Len = certificat
f4b0: 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72  e_len;........br
f4c0: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
f4d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f4e0: 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
f4f0: 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
f500: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
f510: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
f520: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
f530: 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52  .case CKA_ISSUER
f540: 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
f550: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
f560: 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
f570: 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25 30  CKA_ISSUER (0x%0
f580: 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
f590: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
f5a0: 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
f5b0: 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
f5c0: 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
f5d0: 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ATE) {......CACK
f5e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f5f0: 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
f600: 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
f610: 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
f620: 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09  rtificate.");...
f630: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
f640: 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
f650: 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
f660: 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
f670: 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69  _ret = x509_to_i
f680: 73 73 75 65 72 28 63 65 72 74 69 66 69 63 61 74  ssuer(certificat
f690: 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
f6a0: 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
f6b0: 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
f6c0: 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
f6d0: 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
f6e0: 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
f6f0: 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
f700: 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
f710: 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
f720: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f730: 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
f740: 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
f750: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
f760: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
f770: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
f780: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52  ....case CKA_SER
f790: 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09  IAL_NUMBER:.....
f7a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f7b0: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
f7c0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45  attribute CKA_SE
f7d0: 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25  RIAL_NUMBER (0x%
f7e0: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
f7f0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
f800: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
f810: 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
f820: 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
f830: 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43  CATE) {......CAC
f840: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f850: 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
f860: 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
f870: 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
f880: 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a  ertificate.");..
f890: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
f8a0: 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
f8b0: 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
f8c0: 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
f8d0: 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
f8e0: 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61  serial(certifica
f8f0: 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
f900: 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
f910: 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
f920: 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
f930: 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
f940: 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
f950: 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
f960: 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
f970: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
f980: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f990: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
f9a0: 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
f9b0: 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
f9c0: 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
f9d0: 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
f9e0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
f9f0: 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43  SUBJECT:.....CAC
fa00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fa10: 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
fa20: 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45  ribute CKA_SUBJE
fa30: 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  CT (0x%08lx) ...
fa40: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
fa50: 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
fa60: 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
fa70: 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
fa80: 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
fa90: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
faa0: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
fab0: 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
fac0: 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
fad0: 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
fae0: 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  e.");.......brea
faf0: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
fb00: 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
fb10: 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
fb20: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
fb30: 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63  509_to_subject(c
fb40: 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
fb50: 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
fb60: 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
fb70: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
fb80: 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
fb90: 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
fba0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
fbb0: 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
fbc0: 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
fbd0: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
fbe0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fbf0: 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
fc00: 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
fc10: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
fc20: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
fc30: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
fc40: 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41  e CKA_ID:.....CA
fc50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fc60: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
fc70: 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20 28  tribute CKA_ID (
fc80: 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
fc90: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
fca0: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
fcb0: 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d  .....ucTmpBuf[0]
fcc0: 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75   = ((identity_nu
fcd0: 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30  m + 1) >> 8) & 0
fce0: 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75  xff;.....ucTmpBu
fcf0: 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74  f[1] =  (identit
fd00: 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66  y_num + 1) & 0xf
fd10: 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  f;......pValue =
fd20: 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09   &ucTmpBuf;.....
fd30: 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a  ulValueLen = 2;.
fd40: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
fd50: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
fd60: 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
fd70: 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
fd80: 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
fd90: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
fda0: 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43  k;....case CKA_C
fdb0: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
fdc0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
fdd0: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
fde0: 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
fdf0: 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
fe00: 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPE (0x%08lx) ..
fe10: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
fe20: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
fe30: 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
fe40: 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
fe50: 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
fe60: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
fe70: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
fe80: 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
fe90: 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
fea0: 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
feb0: 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  te.");.......bre
fec0: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
fed0: 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
fee0: 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74  t one certificat
fef0: 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b  e type */.....ck
ff00: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
ff10: 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a  e = CKC_X_509;..
ff20: 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
ff30: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
ff40: 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
ff50: 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65  n = sizeof(ck_ce
ff60: 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b  rtificate_type);
ff70: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
ff80: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
ff90: 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f  returning CKC_X_
ffa0: 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c  509 (%lu) (%p/%l
ffb0: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
ffc0: 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49  ong) *((CK_CERTI
ffd0: 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70  FICATE_TYPE *) p
ffe0: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
fff0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10000 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
10010 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
10020 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09   CKA_KEY_TYPE:..
10030 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10040 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
10050 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
10060 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38  _KEY_TYPE (0x%08
10070 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
10080 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
10090 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
100a0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
100b0 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
100c0 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
100d0 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s != CKO_PUBLIC_
100e0 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  KEY) {......CACK
100f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10100 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
10110 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
10120 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65   we are not a ke
10130 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  y.");.......brea
10140 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
10150 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
10160 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f   one key type */
10170 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65  .....ck_key_type
10180 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09   = CKK_RSA;.....
10190 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65  .pValue = &ck_ke
101a0 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61  y_type;.....ulVa
101b0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
101c0 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09  ck_key_type);...
101d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
101e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
101f0 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28  urning CKK_RSA (
10200 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20  %lu) (%p/%lu)", 
10210 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10220 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54  *((CK_CERTIFICAT
10230 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65  E_TYPE *) pValue
10240 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
10250 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
10260 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
10270 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
10280 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  SIGN:.....CACKEY
10290 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
102a0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
102b0 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78  ute CKA_SIGN (0x
102c0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
102d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
102e0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
102f0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
10300 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss == CKO_PRIVAT
10310 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  E_KEY) {......pV
10320 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
10330 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
10340 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
10350 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
10360 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
10370 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
10380 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
10390 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
103a0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
103b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
103c0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
103d0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
103e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
103f0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
10400 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
10410 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
10420 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
10430 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
10440 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41  _DECRYPT:.....CA
10450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10460 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
10470 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52  tribute CKA_DECR
10480 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPT (0x%08lx) ..
10490 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
104a0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
104b0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
104c0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
104d0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20  _PRIVATE_KEY || 
104e0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
104f0 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b  KO_PUBLIC_KEY) {
10500 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
10510 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
10520 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
10530 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
10540 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
10550 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
10560 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
10570 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
10580 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
10590 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
105a0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
105b0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
105c0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
105d0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
105e0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
105f0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
10600 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
10610 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10620 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53  case CKA_TRUST_S
10630 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 09  ERVER_AUTH:.....
10640 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10650 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
10660 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
10670 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 20  UST_SERVER_AUTH 
10680 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
10690 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
106a0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
106b0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
106c0 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
106d0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
106e0 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
106f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10700 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
10710 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
10720 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
10730 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
10740 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
10750 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
10760 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
10770 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
10780 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c  ase CKA_TRUST_CL
10790 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 09 43  IENT_AUTH:.....C
107a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
107b0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
107c0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
107d0 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 20 28  ST_CLIENT_AUTH (
107e0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
107f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
10800 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
10810 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
10820 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
10830 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
10840 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
10850 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10860 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
10870 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
10880 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10890 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
108a0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
108b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
108c0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
108d0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
108e0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44  se CKA_TRUST_COD
108f0 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 09 43  E_SIGNING:.....C
10900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10910 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
10920 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
10930 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 20  ST_CODE_SIGNING 
10940 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
10950 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10960 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
10970 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
10980 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
10990 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
109a0 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
109b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
109c0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
109d0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
109e0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
109f0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
10a00 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
10a10 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
10a20 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
10a30 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
10a40 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ase CKA_TRUST_EM
10a50 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a  AIL_PROTECTION:.
10a60 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10a70 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
10a80 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
10a90 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52  A_TRUST_EMAIL_PR
10aa0 4f 54 45 43 54 49 4f 4e 20 28 30 78 25 30 38 6c  OTECTION (0x%08l
10ab0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
10ac0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
10ad0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
10ae0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
10af0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
10b00 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
10b10 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
10b20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
10b30 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
10b40 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
10b50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
10b60 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
10b70 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
10b80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
10b90 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
10ba0 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a  eak;....default:
10bb0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
10bc0 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  LL;.....ulValueL
10bd0 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
10be0 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  1;.....break;...
10bf0 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f  }....if (((CK_LO
10c00 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20  NG) ulValueLen) 
10c10 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  != ((CK_LONG) -1
10c20 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20  )) {..../* Push 
10c30 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74  curr_attr onto t
10c40 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63  he stack */....c
10c50 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20  urr_attr.type = 
10c60 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a  curr_attr_type;.
10c70 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  ...curr_attr.ulV
10c80 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75  alueLen = ulValu
10c90 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61  eLen;.....curr_a
10ca0 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c  ttr.pValue = mal
10cb0 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c  loc(curr_attr.ul
10cc0 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65  ValueLen);....me
10cd0 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70  mcpy(curr_attr.p
10ce0 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63  Value, pValue, c
10cf0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
10d00 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56  Len);.....if (pV
10d10 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 61  alue_free && pVa
10d20 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28  lue) {.....free(
10d30 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09  pValue);....}...
10d40 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e  ..if (numattrs >
10d50 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20  = retval_count) 
10d60 7b 0a 09 09 09 09 72 65 74 76 61 6c 5f 63 6f 75  {.....retval_cou
10d70 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 72 65 74  nt *= 2;.....ret
10d80 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65  val = realloc(re
10d90 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75  tval, retval_cou
10da0 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
10db0 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  val));....}.....
10dc0 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e  memcpy(&retval[n
10dd0 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f  umattrs], &curr_
10de0 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72  attr, sizeof(cur
10df0 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d  r_attr));....num
10e00 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  attrs++;...}..}.
10e10 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21  ..if (numattrs !
10e20 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f  = 0) {...retval_
10e30 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  count = numattrs
10e40 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ;...retval = rea
10e50 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
10e60 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
10e70 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d  of(*retval));..}
10e80 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72   else {...free(r
10e90 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61  etval);....retva
10ea0 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a  l = NULL;..}...*
10eb0 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74  pulCount = numat
10ec0 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  trs;...CACKEY_DE
10ed0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
10ee0 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74  rning %lu object
10ef0 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74  s (%p).", numatt
10f00 72 73 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  rs, retval);...r
10f10 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
10f20 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  ..static void ca
10f30 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
10f40 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
10f50 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
10f60 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65  ntities, unsigne
10f70 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65  d long identitie
10f80 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  s_count) {..CK_A
10f90 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
10fa0 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ttr;..unsigned l
10fb0 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72  ong id_idx, attr
10fc0 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e  _idx;...if (iden
10fd0 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c  tities == NULL |
10fe0 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  | identities_cou
10ff0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74  nt == 0) {...ret
11000 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  urn;..}...for (i
11010 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64  d_idx = 0; id_id
11020 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63  x < identities_c
11030 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20  ount; id_idx++) 
11040 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69  {...if (identiti
11050 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
11060 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20  butes) {....for 
11070 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61  (attr_idx = 0; a
11080 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69  ttr_idx < identi
11090 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
110a0 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61  ributes_count; a
110b0 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
110c0 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64  .curr_attr = &id
110d0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
110e0 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72  .attributes[attr
110f0 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28  _idx];......if (
11100 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
11110 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  e) {......free(c
11120 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
11130 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
11140 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
11150 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
11160 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28  tes) {.....free(
11170 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
11180 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a  x].attributes);.
11190 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
111a0 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74  free_certs(ident
111b0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
111c0 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20  sc_identity, 1, 
111d0 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65  1);...}..}...fre
111e0 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d  e(identities);.}
111f0 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
11200 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
11210 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65  *cackey_read_ide
11220 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
11230 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
11240 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
11250 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73  *ids_found) {..s
11260 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
11270 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
11280 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74  _identities;..st
11290 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
112a0 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
112b0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
112c0 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78   num_ids, id_idx
112d0 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a  , curr_id_type;.
112e0 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
112f0 75 6d 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69  um_certs, cert_i
11300 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
11310 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
11320 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f  d.");...if (ids_
11330 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  found == NULL) {
11340 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11350 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
11360 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c  ids_found is NUL
11370 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  L");....return(N
11380 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f  ULL);..}...pcsc_
11390 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
113a0 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73  key_read_certs(s
113b0 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f  lot, NULL, &num_
113c0 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73  certs);..if (pcs
113d0 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
113e0 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e  NULL) {.../* Con
113f0 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43  vert number of C
11400 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f  erts to number o
11410 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e  f objects */...n
11420 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52  um_ids = (CKO_PR
11430 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f  IVATE_KEY - CKO_
11440 43 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 29  CERTIFICATE + 1)
11450 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09   * num_certs;...
11460 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61  .identities = ma
11470 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73  lloc(num_ids * s
11480 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
11490 73 29 29 3b 0a 0a 09 09 69 64 5f 69 64 78 20 3d  s));....id_idx =
114a0 20 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f   0;...for (cert_
114b0 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64  idx = 0; cert_id
114c0 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63  x < num_certs; c
114d0 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ert_idx++) {....
114e0 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70  for (curr_id_typ
114f0 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  e = CKO_CERTIFIC
11500 41 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  ATE; curr_id_typ
11510 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  e <= CKO_PRIVATE
11520 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79  _KEY; curr_id_ty
11530 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e  pe++) {.....iden
11540 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
11550 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
11560 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
11570 73 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20  s(curr_id_type, 
11580 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  &pcsc_identities
11590 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74  [cert_idx], cert
115a0 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65  _idx, &identitie
115b0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
115c0 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  utes_count);....
115d0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
115e0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
115f0 74 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tes == NULL) {..
11600 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
11610 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
11620 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  s_count = 0;....
11630 09 7d 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69  .}......identiti
11640 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
11650 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  identity = mallo
11660 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  c(sizeof(*identi
11670 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
11680 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09  c_identity));...
11690 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74  ..memcpy(identit
116a0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
116b0 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63  _identity, &pcsc
116c0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
116d0 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69  _idx], sizeof(*i
116e0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
116f0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29  ].pcsc_identity)
11700 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69  );......identiti
11710 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
11720 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
11730 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70  icate = malloc(p
11740 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
11750 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69  ert_idx].certifi
11760 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d  cate_len);.....m
11770 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73  emcpy(identities
11780 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
11790 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
117a0 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69  ate, pcsc_identi
117b0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
117c0 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63  ertificate, pcsc
117d0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
117e0 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
117f0 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f  e_len);......id_
11800 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  idx++;....}...}.
11810 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
11820 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
11830 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
11840 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75   1);....*ids_fou
11850 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 09 09  nd = num_ids;...
11860 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65  return(identitie
11870 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f  s);..}...*ids_fo
11880 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  und = 0;..return
11890 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  (NULL);.}..CK_DE
118a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
118b0 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a  _RV, C_Initializ
118c0 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
118d0 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f  InitArgs) {..CK_
118e0 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
118f0 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09  S CK_PTR args;..
11900 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69  uint32_t idx;..i
11910 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  nt mutex_init_re
11920 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
11930 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
11940 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 69 74  .");...if (pInit
11950 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Args != NULL) {.
11960 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72  ..args = pInitAr
11970 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61  gs;...memcpy(&ca
11980 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c  ckey_args, args,
11990 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61   sizeof(cackey_a
119a0 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72  rgs));....if (ar
119b0 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20  gs->CreateMutex 
119c0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
119d0 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d  >DestroyMutex ==
119e0 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c   NULL || args->L
119f0 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
11a00 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b   || args->Unlock
11a10 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Mutex == NULL) {
11a20 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
11a30 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c  eateMutex != NUL
11a40 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
11a50 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  oyMutex != NULL 
11a60 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
11a70 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
11a80 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
11a90 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43  != NULL) {.....C
11aa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ab0 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c  TF("Error. Some,
11ac0 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72   but not All thr
11ad0 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65  eading primitive
11ae0 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a  s provided.");..
11af0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
11b00 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
11b10 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 61  ..}...}....if (a
11b20 72 67 73 2d 3e 70 52 65 73 65 72 76 65 64 20 21  rgs->pReserved !
11b30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43  = NULL) {....CAC
11b40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11b50 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
11b60 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
11b70 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
11b80 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
11b90 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
11ba0 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  ..cackey_args.Cr
11bb0 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  eateMutex = NULL
11bc0 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
11bd0 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e  DestroyMutex = N
11be0 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
11bf0 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e  gs.LockMutex = N
11c00 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
11c10 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d  gs.UnlockMutex =
11c20 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
11c30 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a  args.flags = 0;.
11c40 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
11c50 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
11c60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11c70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c  INTF("Error.  Al
11c80 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65  ready initialize
11c90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
11ca0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52  CKR_CRYPTOKI_ALR
11cb0 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44  EADY_INITIALIZED
11cc0 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
11cd0 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
11ce0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
11cf0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
11d00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
11d10 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
11d20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
11d30 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
11d40 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
11d50 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
11d60 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
11d70 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
11d80 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  lots[0])); idx++
11d90 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ) {...cackey_slo
11da0 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ts[idx].active =
11db0 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
11dc0 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
11dd0 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  der = NULL;...ca
11de0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
11df0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
11e00 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  h = 0;...cackey_
11e10 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f  slots[idx].slot_
11e20 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09  reset = 0;..}...
11e30 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
11e40 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63  ed = 1;...if (!c
11e50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
11e60 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e  it) {...mutex_in
11e70 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  it_ret = cackey_
11e80 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26 63 61  mutex_create(&ca
11e90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
11ea0 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74  ..if (mutex_init
11eb0 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
11ec0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11ed0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 75 74  NTF("Error.  Mut
11ee0 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
11ef0 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  n failed.");....
11f00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54  .return(CKR_CANT
11f10 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63  _LOCK);...}....c
11f20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
11f30 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43  it = 1;..}...CAC
11f40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11f50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
11f60 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
11f70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
11f80 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
11f90 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
11fa0 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b  , C_Finalize)(CK
11fb0 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72  _VOID_PTR pReser
11fc0 76 65 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  ved) {..uint32_t
11fd0 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
11fe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
11ff0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52  led.");...if (pR
12000 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29  eserved != NULL)
12010 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
12020 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12030 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f   pReserved is no
12040 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
12050 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
12060 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
12070 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
12080 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
12090 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
120a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
120b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
120c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
120d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
120e0 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  ED);..}...for (i
120f0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
12100 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
12110 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
12120 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
12130 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
12140 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
12150 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
12160 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65  ) {....C_CloseSe
12170 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a  ssion(idx);...}.
12180 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .}...cackey_slot
12190 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
121a0 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ();...for (idx =
121b0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
121c0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
121d0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
121e0 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b  slots[0])); idx+
121f0 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
12200 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
12210 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09 66  c_reader) {....f
12220 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ree(cackey_slots
12230 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65  [idx].pcsc_reade
12240 72 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  r);...}..}...cac
12250 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
12260 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f  ect();...cackey_
12270 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
12280 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12290 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
122a0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
122b0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
122c0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
122d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
122e0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66  (CK_RV, C_GetInf
122f0 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70  o)(CK_INFO_PTR p
12300 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
12310 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75  CK_UTF8CHAR manu
12320 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22  facturerID[] = "
12330 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22  U.S. Government"
12340 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
12350 38 43 48 41 52 20 6c 69 62 72 61 72 79 44 65 73  8CHAR libraryDes
12360 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41  cription[] = "CA
12370 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f  CKey";...CACKEY_
12380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
12390 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
123a0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
123b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
123c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
123d0 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
123e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
123f0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
12400 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
12410 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
12420 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12430 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
12440 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
12450 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
12460 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
12470 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70  IALIZED);..}...p
12480 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65  Info->cryptokiVe
12490 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28  rsion.major = ((
124a0 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
124b0 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
124c0 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49   16) & 0xff;..pI
124d0 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72  nfo->cryptokiVer
124e0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43  sion.minor = ((C
124f0 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
12500 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
12510 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d  8) & 0xff;...mem
12520 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  set(pInfo->manuf
12530 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20  acturerID, ' ', 
12540 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
12550 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a  nufacturerID));.
12560 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
12570 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d  anufacturerID, m
12580 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73  anufacturerID, s
12590 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72  izeof(manufactur
125a0 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49  erID) - 1);...pI
125b0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30  nfo->flags = 0x0
125c0 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  0;...memset(pInf
125d0 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
125e0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
125f0 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  of(pInfo->librar
12600 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a  yDescription));.
12610 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
12620 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
12630 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  n, libraryDescri
12640 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69  ption, sizeof(li
12650 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
12660 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
12670 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
12680 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
12690 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
126a0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
126b0 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69  fo->libraryVersi
126c0 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b  on.minor = (cack
126d0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
126e0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
126f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12700 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
12710 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
12720 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
12730 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  KR_OK);.}../*. *
12740 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66   Process list of
12750 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72   readers, and cr
12760 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74  eate mapping bet
12770 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65  ween reader name
12780 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f   and slot ID. */
12790 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
127a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
127b0 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f  SlotList)(CK_BBO
127c0 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c  OL tokenPresent,
127d0 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20   CK_SLOT_ID_PTR 
127e0 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c  pSlotList, CK_UL
127f0 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
12800 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
12810 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63  etval;..int pcsc
12820 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43  _connect_ret;..C
12830 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73  K_ULONG count, s
12840 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63  lot_count = 0, c
12850 75 72 72 73 6c 6f 74 3b 0a 09 63 68 61 72 20 2a  urrslot;..char *
12860 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70  pcsc_readers, *p
12870 63 73 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a  csc_readers_s, *
12880 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a  pcsc_readers_e;.
12890 09 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61 64  .DWORD pcsc_read
128a0 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73  ers_len;..LONG s
128b0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
128c0 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75  _ret;..size_t cu
128d0 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a  rr_reader_len;..
128e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
128f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
12900 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20  ...if (pulCount 
12910 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
12920 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12930 28 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e  ("Error. pulCoun
12940 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
12950 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
12960 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
12970 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
12980 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
12990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
129a0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
129b0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
129c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
129d0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
129e0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  LIZED);..}...mut
129f0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
12a00 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
12a10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
12a20 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
12a30 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
12a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12a50 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
12a60 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
12a70 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
12a80 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a  _ERROR);..}.../*
12a90 20 43 6c 65 61 72 20 6c 69 73 74 20 6f 66 20 73   Clear list of s
12aa0 6c 6f 74 73 20 2a 2f 0a 09 69 66 20 28 70 53 6c  lots */..if (pSl
12ab0 6f 74 4c 69 73 74 29 20 7b 0a 09 09 2f 2a 20 4f  otList) {.../* O
12ac0 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c  nly update the l
12ad0 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20  ist of slots if 
12ae0 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  we are actually 
12af0 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65  being supply the
12b00 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f   slot informatio
12b10 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73 6c  n */...cackey_sl
12b20 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
12b30 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63 75  ll();....for (cu
12b40 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72  rrslot = 0; curr
12b50 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
12b60 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
12b70 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
12b80 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
12b90 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61  t++) {....if (ca
12ba0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
12bb0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
12bc0 29 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63  ) {.....free(cac
12bd0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
12be0 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
12bf0 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  ;......cackey_sl
12c00 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
12c10 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c  sc_reader = NULL
12c20 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
12c30 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
12c40 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09  ].active = 0;...
12c50 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  }..}.../* Determ
12c60 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64  ine list of read
12c70 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e  ers */..pcsc_con
12c80 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
12c90 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
12ca0 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
12cb0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
12cc0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
12cd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12ce0 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
12cf0 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
12d00 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c  , assuming no sl
12d10 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63  ots");....slot_c
12d20 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73  ount = 0;..} els
12d30 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65  e {...pcsc_reade
12d40 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73  rs_len = 0;....s
12d50 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
12d60 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
12d70 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
12d80 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
12d90 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72  L, NULL, &pcsc_r
12da0 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 69  eaders_len);...i
12db0 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61  f (scard_listrea
12dc0 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  ders_ret == SCAR
12dd0 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20 70  D_S_SUCCESS && p
12de0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20  csc_readers_len 
12df0 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f  != 0) {....pcsc_
12e00 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63  readers = malloc
12e10 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  (pcsc_readers_le
12e20 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64  n);....pcsc_read
12e30 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61  ers_s = pcsc_rea
12e40 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f  ders;.....scard_
12e50 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20  listreaders_ret 
12e60 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  = SCardListReade
12e70 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  rs(*cackey_pcsc_
12e80 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63  handle, NULL, pc
12e90 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73  sc_readers, &pcs
12ea0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
12eb0 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73  ...if (scard_lis
12ec0 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20  treaders_ret == 
12ed0 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
12ee0 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64   {.....pcsc_read
12ef0 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61  ers_e = pcsc_rea
12f00 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64  ders + pcsc_read
12f10 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 63 75  ers_len;......cu
12f20 72 72 73 6c 6f 74 20 3d 20 30 3b 0a 09 09 09 09  rrslot = 0;.....
12f30 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61 64  while (pcsc_read
12f40 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64 65  ers < pcsc_reade
12f50 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 63 75 72  rs_e) {......cur
12f60 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73  r_reader_len = s
12f70 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65  trlen(pcsc_reade
12f80 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28  rs);.......if ((
12f90 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63  pcsc_readers + c
12fa0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20  urr_reader_len) 
12fb0 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  > pcsc_readers_e
12fc0 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  ) {.......break;
12fd0 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66  ......}.......if
12fe0 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65   (curr_reader_le
12ff0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09  n == 0) {.......
13000 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
13010 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74  ....if (currslot
13020 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
13030 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
13040 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
13050 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41  0]))) {.......CA
13060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13070 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65  F("Found more re
13080 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73  aders than slots
13090 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22   are available!"
130a0 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
130b0 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41  ......}.......CA
130c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
130d0 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a  F("Found reader:
130e0 20 25 73 22 2c 20 70 63 73 63 5f 72 65 61 64 65   %s", pcsc_reade
130f0 72 73 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e  rs);......./* On
13100 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69  ly update the li
13110 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77  st of slots if w
13120 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62  e are actually b
13130 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20  eing supply the 
13140 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
13150 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c   */......if (pSl
13160 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09  otList) {.......
13170 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
13180 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20  rslot].active = 
13190 31 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  1;.......cackey_
131a0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
131b0 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74  pcsc_reader = st
131c0 72 64 75 70 28 70 63 73 63 5f 72 65 61 64 65 72  rdup(pcsc_reader
131d0 73 29 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79  s);.......cackey
131e0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
131f0 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  .pcsc_card_conne
13200 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09 09  cted = 0;.......
13210 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
13220 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69  rslot].transacti
13230 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
13240 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
13250 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f  [currslot].slot_
13260 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 09  reset = 1;......
13270 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f 74 2b  }......currslot+
13280 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f 72 65  +;.......pcsc_re
13290 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65  aders += curr_re
132a0 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09  ader_len + 1;...
132b0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 75 72  ..}......if (cur
132c0 72 73 6c 6f 74 20 3e 20 30 29 20 7b 0a 09 09 09  rslot > 0) {....
132d0 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 63  ..slot_count = c
132e0 75 72 72 73 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09  urrslot;.....}..
132f0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
13300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13310 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20  TF("Second call 
13320 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  to SCardListRead
13330 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ers failed, retu
13340 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b  rn %s/%li", CACK
13350 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
13360 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
13370 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
13380 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
13390 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
133a0 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72  et);....}.....fr
133b0 65 65 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ee(pcsc_readers_
133c0 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  s);...} else {..
133d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
133e0 52 49 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c  RINTF("First cal
133f0 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65  l to SCardListRe
13400 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65  aders failed, re
13410 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41  turn %s/%li", CA
13420 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
13430 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
13440 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
13450 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  s_ret), (long) s
13460 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
13470 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  _ret);...}..}...
13480 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
13490 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
134a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
134b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
134c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
134d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
134e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
134f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
13500 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
13510 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
13520 09 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69  .}...if (pSlotLi
13530 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
13540 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74  *pulCount = slot
13550 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45  _count;....CACKE
13560 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13570 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
13580 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
13590 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
135a0 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d  K);..}...count =
135b0 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20   *pulCount;..if 
135c0 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f  (count < slot_co
135d0 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  unt) {...CACKEY_
135e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
135f0 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61  ror. User alloca
13600 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c  ted %lu entries,
13610 20 62 75 74 20 77 65 20 68 61 76 65 20 25 6c 75   but we have %lu
13620 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e   entries.", coun
13630 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a  t, slot_count);.
13640 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55  ...return(CKR_BU
13650 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b  FFER_TOO_SMALL);
13660 09 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72  ...}...for (curr
13670 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c  slot = 0; currsl
13680 6f 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b  ot < slot_count;
13690 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
136a0 09 70 53 6c 6f 74 4c 69 73 74 5b 63 75 72 72 73  .pSlotList[currs
136b0 6c 6f 74 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b  lot] = currslot;
136c0 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  ..}...*pulCount 
136d0 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09  = slot_count;...
136e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
136f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
13700 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75  KR_OK (%i).  Fou
13710 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e 22  nd %lu readers."
13720 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67  , CKR_OK, (unsig
13730 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63  ned long) slot_c
13740 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ount);...return(
13750 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e  CKR_OK);...token
13760 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50  Present = tokenP
13770 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65  resent; /* Supre
13780 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
13790 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
137a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
137b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
137c0 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f  SlotInfo)(CK_SLO
137d0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
137e0 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49  SLOT_INFO_PTR pI
137f0 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43  nfo) {..static C
13800 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74 44  K_UTF8CHAR slotD
13810 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22  escription[] = "
13820 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69  CACKey Slot";..i
13830 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
13840 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63  ..int bytes_to_c
13850 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  opy;...CACKEY_DE
13860 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
13870 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
13880 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
13890 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
138a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
138b0 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
138c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
138d0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
138e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
138f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
13900 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13910 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
13920 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
13930 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
13940 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
13950 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
13960 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
13970 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
13980 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
13990 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
139a0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
139b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
139c0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
139d0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
139e0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
139f0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
13a00 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
13a10 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
13a20 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
13a30 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
13a40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
13a50 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
13a60 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
13a70 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
13a80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13a90 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
13aa0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
13ab0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
13ac0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
13ad0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
13ae0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
13af0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
13b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13b10 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
13b20 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
13b30 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
13b40 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
13b50 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
13b60 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
13b70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
13b80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
13b90 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
13ba0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
13bb0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
13bc0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
13bd0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
13be0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
13bf0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
13c00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13c10 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
13c20 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
13c30 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
13c40 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73  RROR);..}...mems
13c50 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  et(pInfo->slotDe
13c60 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20  scription, ' ', 
13c70 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c  sizeof(pInfo->sl
13c80 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b  otDescription));
13c90 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
13ca0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c  slotDescription,
13cb0 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e   slotDescription
13cc0 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73  , sizeof(slotDes
13cd0 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a  cription) - 1);.
13ce0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
13cf0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
13d00 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
13d10 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
13d20 44 29 29 3b 0a 0a 09 62 79 74 65 73 5f 74 6f 5f  D));...bytes_to_
13d30 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 63 61  copy = strlen(ca
13d40 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
13d50 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  D].pcsc_reader);
13d60 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70 49 6e  ..if (sizeof(pIn
13d70 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
13d80 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63  ID) < bytes_to_c
13d90 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73 5f 74  opy) {...bytes_t
13da0 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28  o_copy = sizeof(
13db0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
13dc0 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63  rerID);..}..memc
13dd0 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
13de0 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b 65 79  cturerID, cackey
13df0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70  _slots[slotID].p
13e00 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79 74 65  csc_reader, byte
13e10 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 70 49  s_to_copy);...pI
13e20 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
13e30 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43  _REMOVABLE_DEVIC
13e40 45 20 7c 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b  E | CKF_HW_SLOT;
13e50 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
13e60 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
13e70 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
13e80 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) == CACKEY_PCS
13e90 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
13ea0 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
13eb0 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f  gs |= CKF_TOKEN_
13ec0 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 70 49  PRESENT;..}...pI
13ed0 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72  nfo->hardwareVer
13ee0 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61  sion.major = (ca
13ef0 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
13f00 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
13f10 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
13f20 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
13f30 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
13f40 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78  ion() >> 8) & 0x
13f50 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  ff;...pInfo->fir
13f60 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  mwareVersion.maj
13f70 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66  or = 0x00;..pInf
13f80 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
13f90 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b  on.minor = 0x00;
13fa0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13fb0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
13fc0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
13fd0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
13fe0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
13ff0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
14000 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b  (CK_RV, C_GetTok
14010 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  enInfo)(CK_SLOT_
14020 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f  ID slotID, CK_TO
14030 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  KEN_INFO_PTR pIn
14040 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
14050 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61  _UTF8CHAR manufa
14060 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e  cturerID[] = "U.
14070 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a  S. Government";.
14080 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
14090 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62 65 6c  HAR defaultLabel
140a0 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f  [] = "Unknown To
140b0 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20 43 4b  ken";..static CK
140c0 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b  _UTF8CHAR model[
140d0 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b  ] = "CAC Token";
140e0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
140f0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
14100 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
14110 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
14120 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a 65  um_certs;..ssize
14130 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69  _t label_ret;..i
14140 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
14150 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61 75 6c  ..int use_defaul
14160 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45  t_label;...CACKE
14170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14180 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
14190 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
141a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
141b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
141c0 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
141d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
141e0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
141f0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
14200 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
14210 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14220 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
14230 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
14240 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
14250 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
14260 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
14270 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
14280 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
14290 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
142a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
142b0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
142c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
142d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
142e0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
142f0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
14300 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
14310 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
14320 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
14330 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
14340 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
14350 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
14360 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
14370 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
14380 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
14390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
143a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
143b0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
143c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
143d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
143e0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
143f0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
14400 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
14410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14420 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
14430 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
14440 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
14450 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
14460 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
14470 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
14480 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
14490 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
144a0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
144b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
144c0 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
144d0 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ent(&cackey_slot
144e0 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41  s[slotID]) != CA
144f0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
14500 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41  NPRESENT) {...CA
14510 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14520 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70  F("No token is p
14530 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44  resent in slotID
14540 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29   = %lu", slotID)
14550 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
14560 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
14570 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
14580 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f  urn(CKR_TOKEN_NO
14590 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a  T_PRESENT);..}..
145a0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
145b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
145c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
145d0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
145e0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
145f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14600 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
14610 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
14620 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
14630 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
14640 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
14650 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66  ne token label f
14660 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74 65 73  rom certificates
14670 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66   */..memset(pInf
14680 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73  o->label, ' ', s
14690 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
146a0 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75  el));..use_defau
146b0 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09  lt_label = 1;...
146c0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
146d0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
146e0 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  rts(&cackey_slot
146f0 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c  s[slotID], NULL,
14700 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69   &num_certs);..i
14710 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  f (pcsc_identiti
14720 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
14730 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
14740 30 29 20 7b 0a 09 09 09 6c 61 62 65 6c 5f 72 65  0) {....label_re
14750 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
14760 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65  identity_to_labe
14770 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  l(pcsc_identitie
14780 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  s, pInfo->label,
14790 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
147a0 61 62 65 6c 29 29 3b 0a 09 09 09 69 66 20 28 6c  abel));....if (l
147b0 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a  abel_ret > 0) {.
147c0 09 09 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  ....use_default_
147d0 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 09 09 7d 0a  label = 0;....}.
147e0 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
147f0 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
14800 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
14810 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 69 66  rts, 1);..}...if
14820 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61   (use_default_la
14830 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  bel) {...memcpy(
14840 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65  pInfo->label, de
14850 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65  faultLabel, size
14860 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29  of(defaultLabel)
14870 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73   - 1);..}...mems
14880 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
14890 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
148a0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
148b0 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09  ufacturerID));..
148c0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
148d0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61  nufacturerID, ma
148e0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69  nufacturerID, si
148f0 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65  zeof(manufacture
14900 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  rID) - 1);...mem
14910 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  set(pInfo->model
14920 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
14930 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d  nfo->model));..m
14940 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emcpy(pInfo->mod
14950 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f  el, model, sizeo
14960 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a  f(model) - 1);..
14970 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73  .memset(pInfo->s
14980 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27  erialNumber, ' '
14990 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
149a0 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a  serialNumber));.
149b0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
149c0 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69  utcTime, ' ', si
149d0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54  zeof(pInfo->utcT
149e0 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  ime));...pInfo->
149f0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
14a00 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
14a10 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
14a20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
14a30 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
14a40 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
14a50 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
14a60 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
14a70 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
14a80 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
14a90 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
14aa0 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
14ab0 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49  nor = 0x00;...pI
14ac0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
14ad0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
14ae0 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   | CKF_USER_PIN_
14af0 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b  INITIALIZED | CK
14b00 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49  F_TOKEN_INITIALI
14b10 5a 45 44 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ZED | CKF_LOGIN_
14b20 52 45 51 55 49 52 45 44 3b 0a 0a 09 70 49 6e 66  REQUIRED;...pInf
14b30 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43  o->ulMaxSessionC
14b40 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63  ount = (sizeof(c
14b50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
14b60 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
14b70 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20  sessions[0])) - 
14b80 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73  1;..pInfo->ulSes
14b90 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55  sionCount = CK_U
14ba0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
14bb0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
14bc0 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f  ulMaxRwSessionCo
14bd0 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  unt = 0;..pInfo-
14be0 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  >ulRwSessionCoun
14bf0 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  t = CK_UNAVAILAB
14c00 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
14c10 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e  .pInfo->ulMaxPin
14c20 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66  Len = 128;..pInf
14c30 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d  o->ulMinPinLen =
14c40 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f   0;..pInfo->ulTo
14c50 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  talPublicMemory 
14c60 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
14c70 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
14c80 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c  Info->ulFreePubl
14c90 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  icMemory = CK_UN
14ca0 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
14cb0 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
14cc0 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d  lTotalPrivateMem
14cd0 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
14ce0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
14cf0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65  ;..pInfo->ulFree
14d00 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
14d10 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
14d20 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41  NFORMATION;...CA
14d30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14d40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
14d50 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
14d60 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
14d70 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
14d80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
14d90 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74  V, C_WaitForSlot
14da0 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20  Event)(CK_FLAGS 
14db0 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49  flags, CK_SLOT_I
14dc0 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43  D_PTR pSlotID, C
14dd0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65  K_VOID_PTR pRese
14de0 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f  rved) {..CACKEY_
14df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
14e00 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
14e10 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c  Reserved != NULL
14e20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14e30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
14e40 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e  . pReserved is n
14e50 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
14e60 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
14e70 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
14e80 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
14e90 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
14ea0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14eb0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
14ec0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
14ed0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
14ee0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
14ef0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
14f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14f10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
14f20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
14f30 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
14f40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
14f50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
14f60 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
14f70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
14f80 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
14f90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
14fa0 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28  tMechanismList)(
14fb0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
14fc0 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  D, CK_MECHANISM_
14fd0 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e  TYPE_PTR pMechan
14fe0 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  ismList, CK_ULON
14ff0 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
15000 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
15010 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
15020 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
15030 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
15040 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15050 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
15060 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
15070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15080 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
15090 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
150a0 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d  .if (pulCount ==
150b0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
150c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
150d0 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74  Error.  pulCount
150e0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
150f0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
15100 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
15110 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69  if (pMechanismLi
15120 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
15130 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 33 3b 0a 0a  *pulCount = 3;..
15140 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15150 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15160 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
15170 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
15180 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
15190 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20  if (*pulCount < 
151a0 33 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  3) {...CACKEY_DE
151b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
151c0 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73  r.  Buffer too s
151d0 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  mall.");....retu
151e0 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  rn(CKR_BUFFER_TO
151f0 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70  O_SMALL);..}...p
15200 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d  MechanismList[0]
15210 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b   = CKM_RSA_PKCS;
15220 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  ..pMechanismList
15230 5b 31 5d 20 3d 20 43 4b 4d 5f 53 48 41 31 5f 52  [1] = CKM_SHA1_R
15240 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f  SA_PKCS;..*pulCo
15250 75 6e 74 20 3d 20 32 3b 0a 0a 09 43 41 43 4b 45  unt = 2;...CACKE
15260 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15270 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
15280 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
15290 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
152a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
152b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
152c0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
152d0 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
152e0 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
152f0 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43  ISM_TYPE type, C
15300 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f  K_MECHANISM_INFO
15310 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
15320 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
15330 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15340 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
15350 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
15360 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
15370 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15380 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
15390 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
153a0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
153b0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
153c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
153d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
153e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
153f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
15400 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
15410 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
15420 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
15430 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
15440 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
15450 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
15460 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
15470 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
15480 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
15490 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
154a0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
154b0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
154c0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
154d0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
154e0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
154f0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
15500 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
15510 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
15520 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
15530 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
15540 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
15550 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
15560 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
15570 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
15580 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
15590 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
155a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
155b0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
155c0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
155d0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
155e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
155f0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
15600 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
15610 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
15620 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
15630 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
15640 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
15650 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
15660 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
15670 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
15680 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
15690 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
156a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
156b0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
156c0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
156d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
156e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
156f0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
15700 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
15710 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
15720 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20  );..}.../* XXX: 
15730 54 68 69 73 20 69 73 20 75 6e 74 65 73 74 65 64  This is untested
15740 2c 20 61 6e 64 20 66 75 72 74 68 65 72 20 49 27  , and further I'
15750 6d 20 6e 6f 74 20 72 65 61 6c 6c 79 20 73 75 72  m not really sur
15760 65 20 69 66 20 74 68 69 73 20 69 73 20 63 6f 72  e if this is cor
15770 72 65 63 74 2e 20 2a 2f 0a 09 73 77 69 74 63 68  rect. */..switch
15780 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65   (type) {...case
15790 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
157a0 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65  ..pInfo->ulMinKe
157b0 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09  ySize = 512;....
157c0 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53  pInfo->ulMaxKeyS
157d0 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70  ize = 8192;....p
157e0 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
157f0 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59  F_HW | CKF_ENCRY
15800 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54  PT | CKF_DECRYPT
15810 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b   | CKF_SIGN | CK
15820 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65  F_VERIFY;....bre
15830 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ak;...case CKM_R
15840 53 41 5f 58 5f 35 30 39 3a 0a 09 09 09 70 49 6e  SA_X_509:....pIn
15850 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
15860 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
15870 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
15880 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
15890 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
158a0 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
158b0 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
158c0 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
158d0 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
158e0 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52  .case CKM_SHA1_R
158f0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66  SA_PKCS:....pInf
15900 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20  o->ulMinKeySize 
15910 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d  = 512;....pInfo-
15920 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20  >ulMaxKeySize = 
15930 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e  8192;....pInfo->
15940 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c  flags = CKF_HW |
15950 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f   CKF_SIGN | CKF_
15960 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b  VERIFY;....break
15970 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
15980 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
15990 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
159a0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
159b0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
159c0 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
159d0 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
159e0 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
159f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
15a00 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f  C_InitToken)(CK_
15a10 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
15a20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
15a30 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
15a40 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  lPinLen, CK_UTF8
15a50 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29  CHAR_PTR pLabel)
15a60 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
15a70 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
15a80 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
15a90 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
15aa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15ab0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15ac0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
15ad0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
15ae0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
15af0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
15b00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15b10 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15b20 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
15b30 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
15b40 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
15b50 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
15b60 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
15b70 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
15b80 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
15b90 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
15ba0 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
15bb0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
15bc0 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43  RV, C_InitPIN)(C
15bd0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
15be0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54   hSession, CK_UT
15bf0 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
15c00 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
15c10 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
15c20 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
15c30 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
15c40 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
15c50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15c60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15c70 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
15c80 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
15c90 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
15ca0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
15cb0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
15cc0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15cd0 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
15ce0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
15cf0 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
15d00 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
15d10 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
15d20 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
15d30 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
15d40 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
15d50 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
15d60 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
15d70 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29  CK_RV, C_SetPIN)
15d80 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
15d90 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
15da0 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c  UTF8CHAR_PTR pOl
15db0 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  dPin, CK_ULONG u
15dc0 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  lOldPinLen, CK_U
15dd0 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77  TF8CHAR_PTR pNew
15de0 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
15df0 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41  NewPinLen) {..CA
15e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15e10 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
15e20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
15e30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
15e40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15e50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
15e60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
15e70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
15e80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
15e90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
15ea0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15eb0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
15ec0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
15ed0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
15ee0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
15ef0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
15f00 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
15f10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
15f20 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
15f30 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f  CTION(CK_RV, C_O
15f40 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  penSession)(CK_S
15f50 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
15f60 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43  K_FLAGS flags, C
15f70 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
15f80 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49  ication, CK_NOTI
15f90 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45  FY notify, CK_SE
15fa0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52  SSION_HANDLE_PTR
15fb0 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75   phSession) {..u
15fc0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78  nsigned long idx
15fd0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
15fe0 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f  val;..int found_
15ff0 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43  session = 0;...C
16000 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16010 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
16020 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b  .if ((flags & CK
16030 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e  F_SERIAL_SESSION
16040 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f  ) != CKF_SERIAL_
16050 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74  SESSION) {...ret
16060 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
16070 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50  PARALLEL_NOT_SUP
16080 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  PORTED);..}...if
16090 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
160a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
160b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
160c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
160d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
160e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
160f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
16100 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
16110 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
16120 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
16130 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
16140 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
16150 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
16160 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16170 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
16180 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
16190 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
161a0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
161b0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
161c0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
161d0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
161e0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
161f0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
16200 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
16210 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
16220 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
16230 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16240 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
16250 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
16260 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
16270 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
16280 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
16290 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
162a0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
162b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
162c0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
162d0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
162e0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
162f0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
16300 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
16310 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
16320 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
16330 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
16340 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
16350 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
16360 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61  at the card is a
16370 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73  ctually in the s
16380 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a  lot. */../* XXX:
16390 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
163a0 75 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74  ure this is in t
163b0 68 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69  he PKCS#11 speci
163c0 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  fication */..if 
163d0 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
163e0 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
163f0 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
16400 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
16410 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
16420 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16430 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72  NTF("Error.  Car
16440 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20  d not present.  
16450 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45  Returning CKR_DE
16460 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a  VICE_REMOVED");.
16470 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
16480 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
16490 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
164a0 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  n(CKR_DEVICE_REM
164b0 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  OVED);..}...for 
164c0 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20  (idx = 1; idx < 
164d0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
164e0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
164f0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
16500 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
16510 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
16520 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
16530 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f  ive) {....found_
16540 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09  session = 1;....
16550 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64  .*phSession = id
16560 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  x;.....cackey_se
16570 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
16580 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65  ve = 1;....cacke
16590 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
165a0 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b  slotID = slotID;
165b0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
165c0 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d  ons[idx].state =
165d0 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53   CKS_RO_PUBLIC_S
165e0 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65  ESSION;....cacke
165f0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
16600 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09  flags = flags;..
16610 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
16620 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45  s[idx].ulDeviceE
16630 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63  rror = 0;....cac
16640 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
16650 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d  ].pApplication =
16660 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09   pApplication;..
16670 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
16680 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20  s[idx].Notify = 
16690 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b  notify;.....cack
166a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
166b0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55  .identities = NU
166c0 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  LL;....cackey_se
166d0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
166e0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
166f0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
16700 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63  sions[idx].searc
16710 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
16720 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
16730 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69  s[idx].sign_acti
16740 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
16750 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
16760 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
16770 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
16780 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
16790 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
167a0 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
167b0 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
167c0 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79  slotID], &cackey
167d0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
167e0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
167f0 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
16800 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
16810 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
16820 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
16830 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
16840 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
16850 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
16860 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16870 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
16880 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
16890 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
168a0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
168b0 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20  !found_session) 
168c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
168d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
168e0 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ng CKR_SESSION_C
168f0 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f  OUNT (%i)", CKR_
16900 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
16910 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
16920 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d  SSION_COUNT);..}
16930 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16940 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
16950 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
16960 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
16970 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
16980 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
16990 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53  (CK_RV, C_CloseS
169a0 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  ession)(CK_SESSI
169b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
169c0 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  on) {..int mutex
169d0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
169e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
169f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
16a00 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
16a10 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
16a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
16a30 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
16a40 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
16a50 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
16a60 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
16a70 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
16a80 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
16a90 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
16aa0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
16ab0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
16ac0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
16ad0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
16ae0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
16af0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
16b00 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
16b10 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
16b20 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
16b30 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
16b40 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
16b50 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
16b60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
16b70 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
16b80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
16b90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16ba0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
16bb0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
16bc0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
16bd0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
16be0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
16bf0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
16c00 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
16c10 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
16c20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
16c30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16c40 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
16c50 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
16c60 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
16c70 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
16c80 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
16c90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
16ca0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
16cb0 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72   = 0;..cackey_fr
16cc0 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
16cd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
16ce0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
16cf0 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
16d00 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
16d10 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
16d20 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
16d30 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
16d40 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
16d50 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
16d60 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
16d70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16d80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
16d90 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
16da0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
16db0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
16dc0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
16dd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
16de0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
16df0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
16e00 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
16e10 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
16e20 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
16e30 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29  loseAllSessions)
16e40 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
16e50 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  ID) {..uint32_t 
16e60 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
16e70 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
16e80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
16e90 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
16ea0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
16eb0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
16ec0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16ed0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
16ee0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
16ef0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
16f00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
16f10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
16f20 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
16f30 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
16f40 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
16f50 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
16f60 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
16f70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
16f80 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
16f90 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
16fa0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
16fb0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
16fc0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
16fd0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
16fe0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
16ff0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
17000 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
17010 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
17020 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
17030 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
17040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17050 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
17060 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
17070 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
17080 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
17090 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
170a0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
170b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
170c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
170d0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
170e0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
170f0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
17100 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
17110 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
17120 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
17130 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
17140 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
17150 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
17160 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
17170 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
17180 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
17190 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
171a0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
171b0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
171c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
171d0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69  ].active) {....i
171e0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
171f0 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21  ns[idx].slotID !
17200 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09  = slotID) {.....
17210 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
17220 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
17230 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
17240 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f  glock);....C_Clo
17250 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a  seSession(idx);.
17260 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
17270 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
17280 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ock);...}..}...m
17290 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
172a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
172b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
172c0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
172d0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
172e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
172f0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
17300 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
17310 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
17320 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
17330 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
17340 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
17350 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
17360 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
17370 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
17380 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
17390 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65  N(CK_RV, C_GetSe
173a0 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45  ssionInfo)(CK_SE
173b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
173c0 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f  ssion, CK_SESSIO
173d0 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  N_INFO_PTR pInfo
173e0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
173f0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
17400 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
17410 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
17420 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
17430 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17440 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
17450 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
17460 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
17470 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
17480 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
17490 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
174a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
174b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
174c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
174d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
174e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
174f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
17500 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
17510 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
17520 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
17530 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
17540 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
17550 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
17560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17570 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
17580 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
17590 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
175a0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
175b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
175c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
175d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
175e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
175f0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
17600 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
17610 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17620 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
17630 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
17640 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
17650 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
17660 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
17670 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
17680 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
17690 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
176a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
176b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
176c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
176d0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
176e0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
176f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
17700 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
17710 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f  ..}...pInfo->slo
17720 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
17730 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
17740 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e  slotID;..pInfo->
17750 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73  state = cackey_s
17760 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
17770 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d  ].state;..pInfo-
17780 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f  >flags = cackey_
17790 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
177a0 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f  n].flags;..pInfo
177b0 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20  ->ulDeviceError 
177c0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
177d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65  s[hSession].ulDe
177e0 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74  viceError;...mut
177f0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
17800 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
17810 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
17820 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
17830 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
17840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17850 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
17860 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
17870 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
17880 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
17890 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
178a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
178b0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
178c0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
178d0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
178e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
178f0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72  CK_RV, C_GetOper
17900 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
17910 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
17920 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
17930 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
17940 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ate, CK_ULONG_PT
17950 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  R pulOperationSt
17960 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ateLen) {..CACKE
17970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17980 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
17990 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
179a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
179b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
179c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
179d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
179e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
179f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
17a00 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
17a10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17a20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
17a30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
17a40 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
17a50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
17a60 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
17a70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
17a80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
17a90 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
17aa0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f  ON(CK_RV, C_SetO
17ab0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
17ac0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
17ad0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
17ae0 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
17af0 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
17b00 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74   ulOperationStat
17b10 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  eLen, CK_OBJECT_
17b20 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69  HANDLE hEncrypti
17b30 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  onKey, CK_OBJECT
17b40 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74  _HANDLE hAuthent
17b50 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43  icationKey) {..C
17b60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17b70 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
17b80 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
17b90 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
17ba0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17bb0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
17bc0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
17bd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
17be0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
17bf0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
17c00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17c10 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
17c20 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
17c30 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
17c40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
17c50 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
17c60 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
17c70 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
17c80 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
17c90 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
17ca0 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f  Login)(CK_SESSIO
17cb0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
17cc0 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20  n, CK_USER_TYPE 
17cd0 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46  userType, CK_UTF
17ce0 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
17cf0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
17d00 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
17d10 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 6c 6f 67  retval;..int log
17d20 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  in_ret;...CACKEY
17d30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
17d40 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
17d50 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
17d60 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
17d70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17d80 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
17d90 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
17da0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
17db0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
17dc0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
17dd0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
17de0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
17df0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
17e00 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
17e10 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
17e20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
17e30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
17e40 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
17e50 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
17e60 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
17e70 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
17e80 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  D);..}...if (use
17e90 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45  rType != CKU_USE
17ea0 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  R) {...CACKEY_DE
17eb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17ec0 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  r.  We only supp
17ed0 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61  ort USER mode, a
17ee0 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64  sked for %lu mod
17ef0 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  e.", (unsigned l
17f00 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a  ong) userType)..
17f10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45  ..return(CKR_USE
17f20 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b  R_TYPE_INVALID);
17f30 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
17f40 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
17f50 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
17f60 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
17f70 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
17f80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17f90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17fa0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
17fb0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
17fc0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
17fd0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
17fe0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
17ff0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
18000 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
18010 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
18020 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
18030 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18040 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
18050 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
18060 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
18070 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
18080 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69  ALID);..}...logi
18090 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c  n_ret = cackey_l
180a0 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ogin(&cackey_slo
180b0 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ts[cackey_sessio
180c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
180d0 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69  tID], pPin, ulPi
180e0 6e 4c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  nLen, NULL);..if
180f0 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43   (login_ret != C
18100 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
18110 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
18120 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
18130 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20  biglock);....if 
18140 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41  (login_ret == CA
18150 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
18160 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ED) {....CACKEY_
18170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18180 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c  ror.  Token is l
18190 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ocked.");.....re
181a0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43  turn(CKR_PIN_LOC
181b0 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69  KED);...} else i
181c0 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
181d0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
181e0 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45  DPIN) {....CACKE
181f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18200 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20  Error.  Invalid 
18210 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  PIN.");.....retu
18220 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  rn(CKR_PIN_INCOR
18230 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  RECT);...}....CA
18240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18250 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f  F("Error.  Unkno
18260 77 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65  wn error returne
18270 64 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f  d from cackey_lo
18280 67 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67  gin() (%i)", log
18290 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  in_ret);....retu
182a0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
182b0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  RROR);..}...cack
182c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
182d0 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b  sion].state = CK
182e0 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49  S_RO_USER_FUNCTI
182f0 4f 4e 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ONS;...mutex_ret
18300 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
18310 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
18320 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
18330 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
18340 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
18350 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18360 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
18370 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
18380 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
18390 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
183a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
183b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
183c0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
183d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
183e0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
183f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
18400 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45   C_Logout)(CK_SE
18410 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
18420 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  ssion) {..int mu
18430 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
18440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18450 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
18460 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
18470 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
18480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18490 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
184a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
184b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
184c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
184d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
184e0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
184f0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
18500 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
18510 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
18520 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
18530 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
18540 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18550 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
18560 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
18570 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
18580 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
18590 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
185a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
185b0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
185c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
185d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
185e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
185f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18600 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
18610 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
18620 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
18630 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
18640 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
18650 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
18660 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
18670 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
18680 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
18690 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
186a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
186b0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
186c0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
186d0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
186e0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
186f0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
18700 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61  ns[hSession].sta
18710 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c  te = CKS_RO_PUBL
18720 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 6d 75  IC_SESSION;...mu
18730 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
18740 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
18750 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
18760 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
18770 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
18780 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18790 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
187a0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
187b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
187c0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
187d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
187e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
187f0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
18800 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
18810 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
18820 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
18830 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65  (CK_RV, C_Create
18840 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
18850 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
18860 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
18870 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
18880 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
18890 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
188a0 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29  LE_PTR phObject)
188b0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
188c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
188d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
188e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
188f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18900 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
18910 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
18920 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
18930 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
18940 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
18950 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18960 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
18970 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
18980 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
18990 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
189a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
189b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
189c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
189d0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
189e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
189f0 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29  V, C_CopyObject)
18a00 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
18a10 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
18a20 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
18a30 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
18a40 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
18a50 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
18a60 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
18a70 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f  ANDLE_PTR phNewO
18a80 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
18a90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
18aa0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
18ab0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
18ac0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
18ad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18ae0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
18af0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
18b00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
18b10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
18b20 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
18b30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
18b40 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
18b50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
18b60 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
18b70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
18b80 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
18b90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
18ba0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
18bb0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
18bc0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72  N(CK_RV, C_Destr
18bd0 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  oyObject)(CK_SES
18be0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
18bf0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
18c00 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20  HANDLE hObject) 
18c10 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
18c20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
18c30 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
18c40 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
18c50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18c60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
18c70 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
18c80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18c90 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
18ca0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
18cb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18cc0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
18cd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
18ce0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
18cf0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
18d00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
18d10 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
18d20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
18d30 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
18d40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
18d50 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a  , C_GetObjectSiz
18d60 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
18d70 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
18d80 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
18d90 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e  hObject, CK_ULON
18da0 47 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b  G_PTR pulSize) {
18db0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18dc0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
18dd0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
18de0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
18df0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18e00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
18e10 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
18e20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18e30 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
18e40 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
18e50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18e60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
18e70 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
18e80 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
18e90 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
18ea0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
18eb0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
18ec0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
18ed0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
18ee0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
18ef0 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56   C_GetAttributeV
18f00 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  alue)(CK_SESSION
18f10 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
18f20 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
18f30 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
18f40 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
18f50 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
18f60 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f   ulCount) {..CK_
18f70 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f  ATTRIBUTE *curr_
18f80 61 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61  attr;..struct ca
18f90 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
18fa0 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e  dentity;..unsign
18fb0 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79  ed long identity
18fc0 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20  _idx, attr_idx, 
18fd0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e  sess_attr_idx, n
18fe0 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74  um_ids;..int mut
18ff0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ex_retval;..CK_R
19000 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  V retval = CKR_O
19010 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  K;..CK_VOID_PTR 
19020 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
19030 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  G ulValueLen;...
19040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19050 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
19060 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
19070 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
19080 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19090 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
190a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
190b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
190c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
190d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
190e0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
190f0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
19100 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
19110 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
19120 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
19130 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
19140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19150 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
19160 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
19170 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
19180 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
19190 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
191a0 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29  f (hObject == 0)
191b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
191c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
191d0 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
191e0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
191f0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
19200 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49  _OBJECT_HANDLE_I
19210 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
19220 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20   (ulCount == 0) 
19230 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
19240 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
19250 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
19260 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
19270 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
19280 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  ly */...CACKEY_D
19290 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
192a0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
192b0 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
192c0 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
192d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
192e0 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c  ..}...if (pTempl
192f0 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate == NULL) {..
19300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19310 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54  INTF("Error.  pT
19320 65 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e  emplate is NULL.
19330 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
19340 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
19350 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f  ;..}...identity_
19360 69 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20  idx = hObject - 
19370 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  1;...mutex_retva
19380 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
19390 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
193a0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
193b0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
193c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
193d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
193e0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
193f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
19400 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
19410 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
19420 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19430 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
19440 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
19450 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
19460 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
19470 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
19480 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
19490 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
194a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
194b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
194c0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69  LID);..}...num_i
194d0 64 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ds = cackey_sess
194e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
194f0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b  dentities_count;
19500 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f  ...if (identity_
19510 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20  idx >= num_ids) 
19520 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
19530 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
19540 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
19550 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19560 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20  "Error.  Object 
19570 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
19580 6e 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69  nge.  identity_i
19590 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64  dx = %lu, num_id
195a0 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69  s = %lu.", (unsi
195b0 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
195c0 69 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e  ity_idx, (unsign
195d0 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73  ed long) num_ids
195e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
195f0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49  _OBJECT_HANDLE_I
19600 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64  NVALID);..}...id
19610 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
19620 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19630 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69  on].identities[i
19640 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09  dentity_idx];...
19650 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20  for (attr_idx = 
19660 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c  0; attr_idx < ul
19670 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b  Count; attr_idx+
19680 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72  +) {...curr_attr
19690 20 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74   = &pTemplate[at
196a0 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c  tr_idx];....pVal
196b0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56  ue = NULL;...ulV
196c0 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
196d0 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45  NG) -1;....CACKE
196e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
196f0 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  Looking for attr
19700 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 28 69  ibute 0x%08lx (i
19710 64 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e  dentity:%lu) ...
19720 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19730 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  g) curr_attr->ty
19740 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  pe, (unsigned lo
19750 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
19760 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f  );....for (sess_
19770 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65  attr_idx = 0; se
19780 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64  ss_attr_idx < id
19790 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
197a0 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61  es_count; sess_a
197b0 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
197c0 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74  if (identity->at
197d0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
197e0 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20  tr_idx].type == 
197f0 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29  curr_attr->type)
19800 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
19810 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19820 20 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75   found it, pValu
19830 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c  e = %p, ulValueL
19840 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74  en = %lu", ident
19850 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
19860 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70  sess_attr_idx].p
19870 56 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d  Value, identity-
19880 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
19890 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c  _attr_idx].ulVal
198a0 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09  ueLen);.........
198b0 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69  .pValue = identi
198c0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
198d0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
198e0 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alue;.....ulValu
198f0 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  eLen = identity-
19900 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
19910 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c  _attr_idx].ulVal
19920 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a  ueLen;....}...}.
19930 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
19940 2d 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c  ->pValue && pVal
19950 75 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72  ue) {....if (cur
19960 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
19970 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  en >= ulValueLen
19980 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  ) {.....memcpy(c
19990 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
199a0 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75  , pValue, ulValu
199b0 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65  eLen);....} else
199c0 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65   {.....ulValueLe
199d0 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
199e0 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
199f0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
19a00 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  MALL;....}...}..
19a10 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  ..curr_attr->ulV
19a20 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75  alueLen = ulValu
19a30 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  eLen;..}...mutex
19a40 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
19a50 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
19a60 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
19a70 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
19a80 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
19a90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19aa0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
19ab0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
19ac0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
19ad0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
19ae0 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
19af0 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  R_ATTRIBUTE_TYPE
19b00 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41  _INVALID) {...CA
19b10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19b20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
19b30 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f  _ATTRIBUTE_TYPE_
19b40 49 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28  INVALID (%i)", (
19b50 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
19b60 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c   else if (retval
19b70 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   == CKR_BUFFER_T
19b80 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41  OO_SMALL) {...CA
19b90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19ba0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
19bb0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
19bc0 4c 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  L (%i)", (int) r
19bd0 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
19be0 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
19bf0 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...CACKEY
19c00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
19c10 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
19c20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74  (%i)", (int) ret
19c30 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  val);..} else {.
19c40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19c50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
19c60 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76   %i", (int) retv
19c70 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  al);..}...return
19c80 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
19c90 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
19ca0 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72  CK_RV, C_SetAttr
19cb0 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53  ibuteValue)(CK_S
19cc0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
19cd0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
19ce0 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
19cf0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
19d00 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
19d10 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
19d20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
19d30 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
19d40 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
19d50 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
19d60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19d70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
19d80 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
19d90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
19da0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
19db0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
19dc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19dd0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
19de0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
19df0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
19e00 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
19e10 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
19e20 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
19e30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
19e40 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
19e50 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
19e60 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  , C_FindObjectsI
19e70 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
19e80 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
19e90 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
19ea0 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
19eb0 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
19ec0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
19ed0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
19ee0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
19ef0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
19f00 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
19f10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
19f20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
19f30 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
19f40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
19f50 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
19f60 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
19f70 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
19f80 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
19f90 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
19fa0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
19fb0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
19fc0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
19fd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19fe0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
19ff0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
1a000 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
1a010 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1a020 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1a030 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1a040 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1a050 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1a060 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1a070 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1a080 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a090 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a0a0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1a0b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a0c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1a0d0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1a0e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1a0f0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
1a100 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1a110 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1a120 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1a130 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1a140 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
1a150 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
1a160 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1a170 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1a180 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
1a190 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a1a0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1a1b0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1a1c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1a1d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1a1e0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a1f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a200 20 53 65 61 72 63 68 20 61 6c 72 65 61 64 79 20   Search already 
1a210 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1a220 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
1a230 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d  TION_ACTIVE);..}
1a240 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1a250 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69  ots[cackey_sessi
1a260 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
1a270 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  otID].slot_reset
1a280 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a290 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73  UG_PRINTF("The s
1a2a0 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65 73  lot has been res
1a2b0 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74  et since we last
1a2c0 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e   looked for iden
1a2d0 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e  tities -- rescan
1a2e0 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63  ning");....if (c
1a2f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a300 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1a310 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
1a320 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64  ..cackey_free_id
1a330 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f  entities(cackey_
1a340 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1a350 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63  n].identities, c
1a360 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a370 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1a380 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  ies_count);.....
1a390 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1a3a0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1a3b0 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  ties = NULL;....
1a3c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1a3d0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1a3e0 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ties_count = 0;.
1a3f0 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ..}....cackey_sl
1a400 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69  ots[cackey_sessi
1a410 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
1a420 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  otID].slot_reset
1a430 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63   = 0;..}...if (c
1a440 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a450 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1a460 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies == NULL) {..
1a470 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1a480 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1a490 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
1a4a0 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26  ead_identities(&
1a4b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63  cackey_slots[cac
1a4c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1a4d0 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20  ssion].slotID], 
1a4e0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
1a4f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1a500 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d  ities_count);..}
1a510 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
1a520 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66   != NULL) {...if
1a530 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
1a540 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  {....cackey_sess
1a550 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1a560 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
1a570 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09  t = ulCount;....
1a580 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1a590 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1a5a0 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28  _query = malloc(
1a5b0 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  ulCount * sizeof
1a5c0 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a  (*pTemplate));..
1a5d0 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
1a5e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1a5f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1a600 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43  , pTemplate, ulC
1a610 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
1a620 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 7d 20  Template));...} 
1a630 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79  else {....cackey
1a640 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1a650 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1a660 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63  _count = 0;....c
1a670 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a680 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1a690 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  query = NULL;...
1a6a0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
1a6b0 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
1a6c0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
1a6d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1a6e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41  biglock);.....CA
1a6f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a700 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
1a710 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69 65  h query specifie
1a720 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e  d as NULL, but n
1a730 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74  umber of query t
1a740 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69  erms not specifi
1a750 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09  ed as 0.");.....
1a760 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1a770 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a  ENTS_BAD);...}..
1a780 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1a790 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1a7a0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
1a7b0 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73   0;...cackey_ses
1a7c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1a7d0 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e  search_query = N
1a7e0 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ULL;..}...cackey
1a7f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1a800 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
1a810 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73  e = 1;..cackey_s
1a820 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1a830 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
1a840 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   = 0;...mutex_re
1a850 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1a860 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1a870 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1a880 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1a890 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1a8a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a8b0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1a8c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1a8d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1a8e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1a8f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a900 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1a910 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1a920 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1a930 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1a940 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1a950 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29  , C_FindObjects)
1a960 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1a970 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1a980 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
1a990 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  R phObject, CK_U
1a9a0 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74  LONG ulMaxObject
1a9b0 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  Count, CK_ULONG_
1a9c0 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75  PTR pulObjectCou
1a9d0 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nt) {..struct ca
1a9e0 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63  ckey_identity *c
1a9f0 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52  urr_id;..CK_ATTR
1aa00 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
1aa10 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72  ;..CK_ULONG curr
1aa20 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75  _id_idx, curr_ou
1aa30 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61  t_id_idx, curr_a
1aa40 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
1aa50 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e  tr_idx;..CK_ULON
1aa60 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c  G matched_count,
1aa70 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f   prev_matched_co
1aa80 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  unt;..int mutex_
1aa90 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1aaa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1aab0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1aac0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1aad0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1aae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1aaf0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1ab00 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1ab10 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1ab20 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1ab30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f  );..}...if (pulO
1ab40 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55  bjectCount == NU
1ab50 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1ab60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ab70 6f 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f  or.  pulObjectCo
1ab80 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  unt is NULL.");.
1ab90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1aba0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1abb0 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20  ...if (phObject 
1abc0 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78  == NULL && ulMax
1abd0 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30  ObjectCount == 0
1abe0 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
1abf0 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20  ircuit, if zero 
1ac00 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65  objects were spe
1ac10 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65  cified return ze
1ac20 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61  ro items immedia
1ac30 74 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62  tely */...*pulOb
1ac40 6a 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a  jectCount = 0;..
1ac50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ac60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ac70 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
1ac80 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
1ac90 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
1aca0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
1acb0 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20  if (phObject == 
1acc0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1acd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ace0 72 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20  rror.  phObject 
1acf0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1ad00 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1ad10 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1ad20 66 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  f (ulMaxObjectCo
1ad30 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  unt == 0) {...CA
1ad40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ad50 46 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d  F("Error.  Maxim
1ad60 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  um number of obj
1ad70 65 63 74 73 20 73 70 65 63 69 66 69 65 64 20 61  ects specified a
1ad80 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65  s zero.");....re
1ad90 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1ada0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1adb0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1adc0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1add0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1ade0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1adf0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1ae00 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1ae10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ae20 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1ae30 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1ae40 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1ae50 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1ae60 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1ae70 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1ae80 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1ae90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1aea0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1aeb0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1aec0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1aed0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1aee0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1aef0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1af00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1af10 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1af20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1af30 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1af40 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1af50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1af60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1af70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1af80 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1af90 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1afa0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1afb0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1afc0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1afd0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1afe0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
1aff0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1b000 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1b010 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1b020 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b030 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
1b040 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  ch not active.")
1b050 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1b060 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
1b070 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1b080 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ...curr_out_id_i
1b090 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75  dx = 0;..for (cu
1b0a0 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b  rr_id_idx = cack
1b0b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1b0c0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
1b0d0 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64  r_id; curr_id_id
1b0e0 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
1b0f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
1b100 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26  entities_count &
1b110 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  & ulMaxObjectCou
1b120 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b  nt; curr_id_idx+
1b130 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d  +) {...curr_id =
1b140 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
1b150 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1b160 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69  tities[curr_id_i
1b170 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  dx];....CACKEY_D
1b180 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f  EBUG_PRINTF("Pro
1b190 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79  cessing identity
1b1a0 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64  :%lu", (unsigned
1b1b0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69   long) curr_id_i
1b1c0 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f  dx);....matched_
1b1d0 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f  count = 0;....fo
1b1e0 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78  r (curr_attr_idx
1b1f0 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f   = 0; curr_attr_
1b200 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
1b210 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1b220 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
1b230 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64  nt; curr_attr_id
1b240 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d  x++) {....prev_m
1b250 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d  atched_count = m
1b260 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09  atched_count;...
1b270 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63  ..curr_attr = &c
1b280 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1b290 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1b2a0 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f  query[curr_attr_
1b2b0 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59  idx];.....CACKEY
1b2c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b2d0 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74   Checking for at
1b2e0 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78 20  tribute 0x%08lx 
1b2f0 69 6e 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e  in identity:%i..
1b300 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1b310 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74  ng) curr_attr->t
1b320 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  ype, (int) curr_
1b330 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b  id_idx);....CACK
1b340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
1b350 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f  F("    Value loo
1b360 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72  king for:", curr
1b370 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
1b380 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
1b390 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28  eLen);.....for (
1b3a0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20  sess_attr_idx = 
1b3b0 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  0; sess_attr_idx
1b3c0 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72   < curr_id->attr
1b3d0 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65  ibutes_count; se
1b3e0 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  ss_attr_idx++) {
1b3f0 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 69 64  .....if (curr_id
1b400 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
1b410 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65  s_attr_idx].type
1b420 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74   == curr_attr->t
1b430 79 70 65 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ype) {......CACK
1b440 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b450 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d  "    ... found m
1b460 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e  atching type ...
1b470 22 29 3b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ");......CACKEY_
1b480 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
1b490 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75      ... our valu
1b4a0 65 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74  e:", curr_id->at
1b4b0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1b4c0 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  tr_idx].pValue, 
1b4d0 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
1b4e0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
1b4f0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
1b500 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 61  ......if (curr_a
1b510 74 74 72 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e  ttr->pValue == N
1b520 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ULL) {.......CAC
1b530 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b540 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
1b550 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63  nd wildcard matc
1b560 68 22 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63  h");........matc
1b570 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09  hed_count++;....
1b580 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
1b590 7d 0a 0a 20 09 09 09 09 09 69 66 20 28 63 75 72  }.. .....if (cur
1b5a0 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
1b5b0 65 6e 20 3d 3d 20 63 75 72 72 5f 69 64 2d 3e 61  en == curr_id->a
1b5c0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
1b5d0 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
1b5e0 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 63 75  Len && memcmp(cu
1b5f0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
1b600 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
1b610 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
1b620 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72  dx].pValue, curr
1b630 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
1b640 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
1b650 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29  lValueLen) == 0)
1b660 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
1b670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
1b680 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65       ... found e
1b690 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09  xact match");...
1b6a0 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75  .....matched_cou
1b6b0 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65  nt++;........bre
1b6c0 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ak;......}.....}
1b6d0 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20  ....}...../* If 
1b6e0 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63 6f  the attribute co
1b6f0 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68  uld not be match
1b700 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74  ed, do not try t
1b710 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e  o match addition
1b720 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f  al attributes */
1b730 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74  ....if (prev_mat
1b740 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61  ched_count == ma
1b750 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09  tched_count) {..
1b760 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09  ...break;....}..
1b770 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65  .}....if (matche
1b780 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65  d_count == cacke
1b790 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1b7a0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1b7b0 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41  y_count) {....CA
1b7c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b7d0 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20  F("  ... All %i 
1b7e0 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
1b7f0 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64  ed for found, ad
1b800 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69  ding identity:%i
1b810 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73   to returned lis
1b820 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  t", (int) cackey
1b830 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1b840 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1b850 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
1b860 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09  rr_id_idx);.....
1b870 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75  phObject[curr_ou
1b880 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72  t_id_idx] = curr
1b890 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09  _id_idx + 1;....
1b8a0 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  .ulMaxObjectCoun
1b8b0 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75  t--;.....curr_ou
1b8c0 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20  t_id_idx++;...} 
1b8d0 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
1b8e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b8f0 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20   ... Not all %i 
1b900 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20  (only found %i) 
1b910 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
1b920 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f  ed for found, no
1b930 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  t adding identit
1b940 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63  y:%i", (int) cac
1b950 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1b960 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1b970 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  ery_count, (int)
1b980 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20   matched_count, 
1b990 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
1b9a0 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b  x);...}..}..cack
1b9b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1b9c0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
1b9d0 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69  r_id = curr_id_i
1b9e0 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43  dx;..*pulObjectC
1b9f0 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f  ount = curr_out_
1ba00 69 64 5f 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f  id_idx;...mutex_
1ba10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1ba20 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1ba30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1ba40 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1ba50 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1ba60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ba70 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1ba80 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1ba90 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1baa0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1bab0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bac0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1bad0 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f  R_OK (%i), num o
1bae0 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43  bjects = %lu", C
1baf0 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63  KR_OK, *pulObjec
1bb00 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72  tCount);...retur
1bb10 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1bb20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1bb30 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
1bb40 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53  jectsFinal)(CK_S
1bb50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1bb60 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d  ession) {..int m
1bb70 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
1bb80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bb90 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1bba0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1bbb0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1bbc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bbd0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1bbe0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1bbf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1bc00 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1bc10 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1bc20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
1bc30 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
1bc40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1bc50 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1bc60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1bc70 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1bc80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1bc90 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
1bca0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
1bcb0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1bcc0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1bcd0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1bce0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1bcf0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1bd00 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1bd10 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1bd20 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1bd30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bd40 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1bd50 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1bd60 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1bd70 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1bd80 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1bd90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1bda0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1bdb0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1bdc0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1bdd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bde0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1bdf0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1be00 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1be10 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1be20 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1be30 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1be40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1be50 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
1be60 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1be70 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1be80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1be90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bea0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
1beb0 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  h not active.");
1bec0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1bed0 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
1bee0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1bef0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1bf00 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1bf10 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  ch_active = 0;..
1bf20 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1bf30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1bf40 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09  arch_query) {...
1bf50 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
1bf60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1bf70 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d  earch_query);..}
1bf80 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1bf90 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1bfa0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1bfb0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1bfc0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1bfd0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bfe0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1bff0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1c000 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c010 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1c020 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1c030 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1c040 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1c050 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1c060 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1c070 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1c080 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
1c090 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ncryptInit)(CK_S
1c0a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1c0b0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
1c0c0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
1c0d0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
1c0e0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
1c0f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c100 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c110 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1c120 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1c130 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c140 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1c150 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1c160 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1c170 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1c180 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1c190 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c1a0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1c1b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1c1c0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1c1d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1c1e0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1c1f0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1c200 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1c210 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1c220 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1c230 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Encrypt)(CK_SESS
1c240 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1c250 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1c260 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
1c270 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
1c280 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
1c290 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  edData, CK_ULONG
1c2a0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
1c2b0 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  dDataLen) {..CAC
1c2c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c2d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1c2e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1c2f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1c300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c310 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1c320 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1c330 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1c340 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1c350 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1c360 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c370 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1c380 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1c390 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1c3a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1c3b0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1c3c0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1c3d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1c3e0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1c3f0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
1c400 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
1c410 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1c420 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1c430 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
1c440 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
1c450 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
1c460 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
1c470 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
1c480 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
1c490 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c4a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1c4b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1c4c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1c4d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c4e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1c4f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1c500 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1c510 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1c520 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1c530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c540 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1c550 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1c560 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1c570 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1c580 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1c590 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1c5a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1c5b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1c5c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1c5d0 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28  C_EncryptFinal)(
1c5e0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1c5f0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1c600 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63  YTE_PTR pLastEnc
1c610 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
1c620 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
1c630 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
1c640 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1c650 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1c660 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1c670 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1c680 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c690 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c6a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1c6b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c6c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1c6d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1c6e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c6f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c700 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1c710 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1c720 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1c730 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1c740 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1c750 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1c760 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1c770 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1c780 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69  RV, C_DecryptIni
1c790 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1c7a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1c7b0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
1c7c0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
1c7d0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
1c7e0 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  y) {..int mutex_
1c7f0 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d  retval;...hKey--
1c800 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1c810 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1c820 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1c830 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1c840 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c850 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c860 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1c870 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c880 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1c890 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1c8a0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
1c8b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1c8c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c8d0 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
1c8e0 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  nism is NULL.");
1c8f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1c900 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1c910 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
1c920 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
1c930 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b   CKM_RSA_PKCS) {
1c940 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c950 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1c960 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
1c970 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69  nism not specifi
1c980 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b  ed as CKM_RSA_PK
1c990 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  CS");....return(
1c9a0 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41  CKR_MECHANISM_PA
1c9b0 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  RAM_INVALID);..}
1c9c0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1c9d0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1c9e0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1c9f0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1ca00 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1ca10 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1ca20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ca30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1ca40 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1ca50 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1ca60 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1ca70 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1ca80 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1ca90 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1caa0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1cab0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1cac0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1cad0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cae0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1caf0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1cb00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1cb10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1cb20 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1cb30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1cb40 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1cb50 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1cb60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1cb70 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1cb80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cb90 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1cba0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1cbb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1cbc0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1cbd0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
1cbe0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1cbf0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1cc00 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1cc10 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1cc20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1cc30 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1cc40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cc50 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79   Decrypt already
1cc60 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
1cc70 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1cc80 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
1cc90 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
1cca0 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
1ccb0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1ccc0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1ccd0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1cce0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1ccf0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1cd00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cd10 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
1cd20 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
1cd30 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79  e (requested key
1cd40 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69   %lu, only %lu i
1cd50 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61  dentities availa
1cd60 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ble).", (unsigne
1cd70 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75  d long) hKey, (u
1cd80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
1cd90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1cda0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1cdb0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  es_count);....re
1cdc0 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
1cdd0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1cde0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1cdf0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
1ce00 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b  rypt_active = 1;
1ce10 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1ce20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
1ce30 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  rypt_mechanism =
1ce40 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
1ce50 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f  hanism;..cackey_
1ce60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1ce70 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
1ce80 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  parm = pMechanis
1ce90 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09  m->pParameter;..
1cea0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ceb0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
1cec0 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d  t_mech_parmlen =
1ced0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50   pMechanism->ulP
1cee0 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61  arameterLen;..ca
1cef0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1cf00 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1cf10 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
1cf20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1cf30 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1cf40 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
1cf50 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1cf60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1cf70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1cf80 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1cf90 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1cfa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1cfb0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1cfc0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1cfd0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1cfe0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1cff0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d000 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1d010 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1d020 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1d030 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1d040 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1d050 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43  RV, C_Decrypt)(C
1d060 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1d070 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1d080 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
1d090 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dData, CK_ULONG 
1d0a0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
1d0b0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
1d0c0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
1d0d0 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
1d0e0 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61  {..CK_ULONG data
1d0f0 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61  len_update, data
1d100 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52  len_final;..CK_R
1d110 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a  V decrypt_ret;..
1d120 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d130 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1d140 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1d150 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1d160 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d170 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1d180 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1d190 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1d1a0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1d1b0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1d1c0 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d  f (pulDataLen ==
1d1d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1d1e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d1f0 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65  Error. pulDataLe
1d200 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
1d210 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1d220 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1d230 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20  .datalen_update 
1d240 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a  = *pulDataLen;..
1d250 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
1d260 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68  _DecryptUpdate(h
1d270 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70  Session, pEncryp
1d280 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79  tedData, ulEncry
1d290 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61  ptedDataLen, pDa
1d2a0 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64  ta, &datalen_upd
1d2b0 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79  ate);..if (decry
1d2c0 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
1d2d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d2e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d2f0 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65  .  DecryptUpdate
1d300 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
1d310 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
1d320 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1d330 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
1d340 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
1d350 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  t_ret);..}...if 
1d360 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74  (pData) {...pDat
1d370 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64  a += datalen_upd
1d380 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e  ate;..}..datalen
1d390 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74  _final = *pulDat
1d3a0 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75  aLen - datalen_u
1d3b0 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74  pdate;...decrypt
1d3c0 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74  _ret = C_Decrypt
1d3d0 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
1d3e0 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
1d3f0 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63  final);..if (dec
1d400 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
1d410 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
1d420 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d430 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61  or.  DecryptFina
1d440 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
1d450 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
1d460 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1d470 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b  g) decrypt_ret);
1d480 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
1d490 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70  pt_ret);..}...*p
1d4a0 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61  ulDataLen = data
1d4b0 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74  len_update + dat
1d4c0 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41  alen_final;...CA
1d4d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d4e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1d4f0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1d500 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1d510 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1d520 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1d530 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61  V, C_DecryptUpda
1d540 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
1d550 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1d560 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
1d570 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
1d580 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
1d590 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
1d5a0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
1d5b0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
1d5c0 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
1d5d0 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34  K_BYTE buf[16384
1d5e0 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c  ];..ssize_t bufl
1d5f0 65 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  en;..CK_RV retva
1d600 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
1d610 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65  ERROR;..int mute
1d620 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
1d630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d640 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1d650 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1d660 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1d670 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d680 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1d690 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1d6a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1d6b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1d6c0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
1d6d0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
1d6e0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
1d6f0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1d700 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1d710 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1d720 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1d730 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d740 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
1d750 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
1d760 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1d770 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1d780 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  LID);..}...if (p
1d790 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d  EncryptedPart ==
1d7a0 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79   NULL && ulEncry
1d7b0 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30  ptedPartLen == 0
1d7c0 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
1d7d0 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65  ircuit if we are
1d7e0 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70   asked to decryp
1d7f0 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a  t nothing... */.
1d800 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d810 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1d820 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
1d830 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
1d840 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
1d850 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
1d860 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61  if (pEncryptedPa
1d870 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
1d880 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d890 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63  NTF("Error. pEnc
1d8a0 72 79 70 74 65 64 50 61 72 74 20 69 73 20 4e 55  ryptedPart is NU
1d8b0 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70  LL, but ulEncryp
1d8c0 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f  tedPartLen is no
1d8d0 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  t 0.");....retur
1d8e0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1d8f0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
1d900 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
1d910 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  n == 0) {...CACK
1d920 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d930 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70  "Error. ulEncryp
1d940 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c  tedPartLen is 0,
1d950 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f   but pPart is no
1d960 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
1d970 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1d980 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1d990 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20   (pulPartLen == 
1d9a0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1d9b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d9c0 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e  rror. pulPartLen
1d9d0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1d9e0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1d9f0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1da00 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1da10 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1da20 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1da30 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1da40 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1da50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1da60 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1da70 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1da80 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1da90 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1daa0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1dab0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1dac0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1dad0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1dae0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1daf0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1db00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1db10 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1db20 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1db30 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1db40 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1db50 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1db60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1db70 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
1db80 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1db90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1dba0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1dbb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1dbc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
1dbd0 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65  crypt not active
1dbe0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1dbf0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
1dc00 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1dc10 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
1dc20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1dc30 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1dc40 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
1dc50 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
1dc60 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64  :..../* Ask card
1dc70 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09   to decrypt */..
1dc80 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65  ..buflen = cacke
1dc90 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63  y_signdecrypt(&c
1dca0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b  ackey_slots[cack
1dcb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1dcc0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 63  sion].slotID], c
1dcd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1dce0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
1dcf0 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72  _identity, pEncr
1dd00 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63  yptedPart, ulEnc
1dd10 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62  ryptedPartLen, b
1dd20 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29  uf, sizeof(buf))
1dd30 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e  ;.....if (buflen
1dd40 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44   < 0) {...../* D
1dd50 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64  ecryption failed
1dd60 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20  . */.....retval 
1dd70 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
1dd80 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69  ROR;....} else i
1dd90 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
1dda0 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70  ng) buflen) > *p
1ddb0 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61  ulPartLen && pPa
1ddc0 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63  rt) {...../* Dec
1ddd0 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20  rypted data too 
1dde0 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74  large */.....ret
1ddf0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
1de00 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
1de10 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28   else {.....if (
1de20 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65  pPart) {......me
1de30 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c  mcpy(pPart, buf,
1de40 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a   buflen);.....}.
1de50 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e  .....*pulPartLen
1de60 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09   = buflen;......
1de70 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
1de80 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
1de90 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1dea0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1deb0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1dec0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1ded0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1dee0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1def0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1df00 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1df10 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1df20 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1df30 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1df40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1df50 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
1df60 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
1df70 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
1df80 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1df90 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
1dfa0 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ecryptFinal)(CK_
1dfb0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1dfc0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1dfd0 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20  _PTR pLastPart, 
1dfe0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1dff0 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09  LastPartLen) {..
1e000 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1e010 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65  ;..int terminate
1e020 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09  _decrypt = 1;...
1e030 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e040 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1e050 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1e060 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1e070 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e080 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1e090 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1e0a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1e0b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1e0c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1e0d0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1e0e0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1e0f0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1e100 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1e110 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1e120 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1e130 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e140 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1e150 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1e160 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1e170 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1e180 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1e190 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  f (pulLastPartLe
1e1a0 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
1e1b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e1c0 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61  TF("Error. pulLa
1e1d0 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c  stPartLen is NUL
1e1e0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1e1f0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1e200 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1e210 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1e220 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1e230 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1e240 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1e250 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1e260 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e270 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1e280 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e290 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1e2a0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
1e2b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1e2c0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
1e2d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1e2e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1e2f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1e300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e310 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1e320 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
1e330 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1e340 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1e350 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1e360 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1e370 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
1e380 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
1e390 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1e3a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1e3b0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1e3c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e3d0 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e  rror.  Decrypt n
1e3e0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1e3f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
1e400 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
1e410 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a  IALIZED);..}...*
1e420 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
1e430 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50   0;...if (pLastP
1e440 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
1e450 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  .terminate_decry
1e460 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  pt = 0;..}...if 
1e470 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  (terminate_decry
1e480 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  pt) {...cackey_s
1e490 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1e4a0 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
1e4b0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
1e4c0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e4d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e4e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1e4f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1e500 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1e510 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e520 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1e530 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1e540 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1e550 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1e560 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e570 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1e580 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1e590 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1e5a0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1e5b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e5c0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69  _RV, C_DigestIni
1e5d0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1e5e0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1e5f0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
1e600 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43  pMechanism) {..C
1e610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e620 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1e630 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1e640 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1e650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e660 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1e670 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1e680 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1e690 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1e6a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1e6b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e6c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1e6d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e6e0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1e6f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1e700 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1e710 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1e720 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1e730 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1e740 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1e750 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49  Digest)(CK_SESSI
1e760 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1e770 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1e780 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
1e790 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
1e7a0 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20  TE_PTR pDigest, 
1e7b0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1e7c0 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41  DigestLen) {..CA
1e7d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e7e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1e7f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1e800 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1e810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e820 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1e830 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1e840 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1e850 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1e860 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1e870 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e880 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1e890 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e8a0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1e8b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e8c0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1e8d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1e8e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1e8f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1e900 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
1e910 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
1e920 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1e930 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1e940 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
1e950 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
1e960 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1e970 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1e980 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1e990 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1e9a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e9b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1e9c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1e9d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e9e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1e9f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1ea00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ea10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1ea20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ea30 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1ea40 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1ea50 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1ea60 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1ea70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1ea80 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1ea90 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1eaa0 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43  , C_DigestKey)(C
1eab0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1eac0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
1ead0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
1eae0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1eaf0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1eb00 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1eb10 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1eb20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1eb30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1eb40 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1eb50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1eb60 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1eb70 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1eb80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1eb90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1eba0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1ebb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1ebc0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1ebd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1ebe0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1ebf0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ec00 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1ec10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1ec20 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61  RV, C_DigestFina
1ec30 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
1ec40 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1ec50 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65  K_BYTE_PTR pDige
1ec60 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
1ec70 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b   pulDigestLen) {
1ec80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ec90 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1eca0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1ecb0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1ecc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ecd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1ece0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1ecf0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ed00 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1ed10 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1ed20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ed30 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1ed40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1ed50 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1ed60 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1ed70 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1ed80 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1ed90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1eda0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1edb0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1edc0 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f   C_SignInit)(CK_
1edd0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1ede0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
1edf0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
1ee00 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
1ee10 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
1ee20 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1ee30 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
1ee40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ee50 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1ee60 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1ee70 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1ee80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ee90 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1eea0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1eeb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1eec0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1eed0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1eee0 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
1eef0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1ef00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ef10 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
1ef20 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1ef30 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1ef40 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1ef50 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
1ef60 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
1ef70 53 41 5f 50 4b 43 53 20 26 26 20 70 4d 65 63 68  SA_PKCS && pMech
1ef80 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
1ef90 20 21 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41   != CKM_SHA1_RSA
1efa0 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45  _PKCS) {...CACKE
1efb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1efc0 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
1efd0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74  m->mechanism not
1efe0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b   specified as CK
1eff0 4d 5f 52 53 41 5f 50 4b 43 53 20 6f 72 20 43 4b  M_RSA_PKCS or CK
1f000 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 22  M_SHA1_RSA_PKCS"
1f010 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f020 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
1f030 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1f040 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1f050 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1f060 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1f070 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1f080 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1f090 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1f0a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f0b0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1f0c0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1f0d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1f0e0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1f0f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1f100 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1f110 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1f120 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f130 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1f140 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1f150 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f160 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1f170 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1f180 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1f190 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1f1a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1f1b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f1c0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1f1d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1f1e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1f1f0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1f200 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f210 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1f220 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1f230 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1f240 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1f250 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1f260 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1f270 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
1f280 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1f290 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1f2a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1f2b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f2c0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
1f2d0 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72  already in progr
1f2e0 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ess.");......ret
1f2f0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
1f300 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
1f310 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b  if (hKey >= cack
1f320 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1f330 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1f340 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b  _count) {...cack
1f350 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1f360 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1f370 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1f380 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f390 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20   Key handle out 
1f3a0 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73  of range (reques
1f3b0 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c  ted key %lu, onl
1f3c0 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73  y %lu identities
1f3d0 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28   available).", (
1f3e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
1f3f0 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  Key, (unsigned l
1f400 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73  ong) cackey_sess
1f410 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1f420 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1f430 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f440 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  KEY_HANDLE_INVAL
1f450 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
1f460 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1f470 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  on].sign_active 
1f480 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  = 1;...cackey_se
1f490 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f4a0 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20  .sign_mechanism 
1f4b0 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  = pMechanism->me
1f4c0 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65  chanism;...cacke
1f4d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1f4e0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
1f4f0 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f   = 128;..cackey_
1f500 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f510 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
1f520 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  = 0;..cackey_ses
1f530 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1f540 73 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f  sign_buf = mallo
1f550 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  c(sizeof(*cackey
1f560 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1f570 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20  on].sign_buf) * 
1f580 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f590 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
1f5a0 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59  uflen);...CACKEY
1f5b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
1f5c0 65 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f  ession %lu sign_
1f5d0 69 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28  identity is %p (
1f5e0 69 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c  identity #%lu)",
1f5f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1f600 20 68 53 65 73 73 69 6f 6e 2c 20 26 63 61 63 6b   hSession, &cack
1f610 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1f620 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1f630 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65  [hKey], (unsigne
1f640 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09  d long) hKey);..
1f650 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f660 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
1f670 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
1f680 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1f690 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
1f6a0 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
1f6b0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1f6c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1f6d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1f6e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1f6f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1f700 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f710 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1f720 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1f730 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1f740 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
1f750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f760 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f770 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1f780 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1f790 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1f7a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1f7b0 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45  V, C_Sign)(CK_SE
1f7c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1f7d0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1f7e0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
1f7f0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
1f800 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
1f810 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
1f820 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
1f830 65 6e 29 20 7b 0a 09 43 4b 5f 52 56 20 73 69 67  en) {..CK_RV sig
1f840 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  n_ret;...CACKEY_
1f850 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1f860 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1f870 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1f880 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1f890 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f8a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1f8b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1f8c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1f8d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1f8e0 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20  ;..}...sign_ret 
1f8f0 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68  = C_SignUpdate(h
1f900 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20  Session, pData, 
1f910 75 6c 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20  ulDataLen);..if 
1f920 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52  (sign_ret != CKR
1f930 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
1f940 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f950 72 6f 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65  ror.  SignUpdate
1f960 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
1f970 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
1f980 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1f990 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
1f9a0 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
1f9b0 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20  ;..}...sign_ret 
1f9c0 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53  = C_SignFinal(hS
1f9d0 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75  ession, pSignatu
1f9e0 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  re, pulSignature
1f9f0 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f  Len);..if (sign_
1fa00 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
1fa10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fa20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1fa30 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75  SignFinal() retu
1fa40 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
1fa50 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
1fa60 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
1fa70 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
1fa80 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
1fa90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1faa0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1fab0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1fac0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1fad0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1fae0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1faf0 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74  _RV, C_SignUpdat
1fb00 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1fb10 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1fb20 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
1fb30 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
1fb40 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  tLen) {..int mut
1fb50 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1fb60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fb70 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1fb80 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1fb90 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1fba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fbb0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1fbc0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1fbd0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1fbe0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1fbf0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
1fc00 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1fc10 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1fc20 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1fc30 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1fc40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1fc50 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1fc60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1fc70 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1fc80 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1fc90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1fca0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1fcb0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
1fcc0 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26  pPart == NULL &&
1fcd0 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29   ulPartLen == 0)
1fce0 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
1fcf0 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20  rcuit if we are 
1fd00 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f  asked to sign no
1fd10 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41  thing... */...CA
1fd20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fd30 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1fd40 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
1fd50 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
1fd60 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
1fd70 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
1fd80 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pPart == NULL) {
1fd90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fda0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1fdb0 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75  Part is NULL, bu
1fdc0 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e  t ulPartLen is n
1fdd0 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ot 0.");....retu
1fde0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1fdf0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1fe00 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  ulPartLen == 0) 
1fe10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fe20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fe30 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20  ulPartLen is 0, 
1fe40 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74  but pPart is not
1fe50 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1fe60 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1fe70 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
1fe80 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1fe90 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1fea0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1feb0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1fec0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1fed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fee0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1fef0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1ff00 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1ff10 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1ff20 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1ff30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1ff40 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1ff50 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1ff60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1ff70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ff80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1ff90 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
1ffa0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1ffb0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1ffc0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1ffd0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1ffe0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1fff0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
20000 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
20010 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20020 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
20030 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20040 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
20050 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
20060 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
20070 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
20080 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69  LIZED);..}...swi
20090 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
200a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
200b0 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ign_mechanism) {
200c0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
200d0 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75  PKCS:..../* Accu
200e0 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20  mulate directly 
200f0 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65  */....if ((cacke
20100 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20110 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
20120 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e  d + ulPartLen) >
20130 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
20140 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
20150 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61  buflen) {.....ca
20160 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20170 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
20180 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63  len *= 2;......c
20190 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
201a0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
201b0 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b  f = realloc(cack
201c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
201d0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20  sion].sign_buf, 
201e0 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73  sizeof(*cackey_s
201f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20200 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61  ].sign_buf) * ca
20210 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20220 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
20230 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  len);....}.....m
20240 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
20250 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20260 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65  sign_buf + cacke
20270 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20280 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
20290 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74  d, pPart, ulPart
202a0 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  Len);.....cackey
202b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
202c0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
202d0 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a   += ulPartLen;..
202e0 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
202f0 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b   CKM_SHA1_RSA_PK
20300 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
20310 6c 61 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31  late into a SHA1
20320 20 68 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b   hash */....cack
20330 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20340 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20350 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
20360 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20370 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
20380 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
20390 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
203a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
203b0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
203c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
203d0 55 50 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72  UPPORTED);....br
203e0 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  eak;..}...mutex_
203f0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20400 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20410 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
20420 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
20430 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
20440 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20450 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
20460 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20470 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20480 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
20490 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
204a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
204b0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
204c0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
204d0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
204e0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
204f0 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29  RV, C_SignFinal)
20500 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
20510 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
20520 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
20530 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ure, CK_ULONG_PT
20540 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  R pulSignatureLe
20550 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  n) {..static CK_
20560 42 59 54 45 20 73 69 67 62 75 66 5b 31 30 32 34  BYTE sigbuf[1024
20570 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62  ];..ssize_t sigb
20580 75 66 6c 65 6e 3b 0a 09 43 4b 5f 52 56 20 72 65  uflen;..CK_RV re
20590 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
205a0 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74  AL_ERROR;..int t
205b0 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
205c0 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  1;..int mutex_re
205d0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
205e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
205f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20600 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20610 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20620 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20630 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20640 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20650 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20660 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20670 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 67  ..}...if (pulSig
20680 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c  natureLen == NUL
20690 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
206a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
206b0 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  r. pulSignatureL
206c0 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
206d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
206e0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
206f0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
20700 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
20710 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
20720 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
20730 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
20740 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
20750 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20760 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
20770 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
20780 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
20790 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
207a0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
207b0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
207c0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
207d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
207e0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
207f0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
20800 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20810 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
20820 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
20830 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
20840 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
20850 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
20860 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20870 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
20880 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20890 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
208a0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
208b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
208c0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
208d0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
208e0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
208f0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
20900 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
20910 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20920 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
20930 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
20940 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20950 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
20960 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20970 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
20980 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  gn not active.")
20990 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
209a0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
209b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
209c0 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
209d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
209e0 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
209f0 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ism) {...case CK
20a00 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f  M_RSA_PKCS:..../
20a10 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69  * Ask card to si
20a20 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f  gn */....CACKEY_
20a30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73  DEBUG_PRINTF("As
20a40 6b 69 6e 67 20 74 6f 20 64 65 63 72 79 70 74 20  king to decrypt 
20a50 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70  from identity %p
20a60 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22   in session %lu"
20a70 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
20a80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
20a90 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69  _identity, (unsi
20aa0 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73  gned long) hSess
20ab0 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c  ion);....sigbufl
20ac0 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e  en = cackey_sign
20ad0 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f  decrypt(&cackey_
20ae0 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73  slots[cackey_ses
20af0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20b00 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
20b10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20b20 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  n].sign_identity
20b30 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
20b40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
20b50 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73  _buf, cackey_ses
20b60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20b70 73 69 67 6e 5f 62 75 66 6c 65 6e 2c 20 73 69 67  sign_buflen, sig
20b80 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62  buf, sizeof(sigb
20b90 75 66 29 29 3b 0a 0a 09 09 09 69 66 20 28 73 69  uf));.....if (si
20ba0 67 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09  gbuflen < 0) {..
20bb0 09 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61  .../* Signing fa
20bc0 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74  iled. */.....ret
20bd0 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
20be0 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c  L_ERROR;....} el
20bf0 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65  se if (((unsigne
20c00 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65  d long) sigbufle
20c10 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75  n) > *pulSignatu
20c20 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74  reLen && pSignat
20c30 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69  ure) {...../* Si
20c40 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61  gned data too la
20c50 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  rge */.....retva
20c60 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
20c70 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74  OO_SMALL;......t
20c80 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
20c90 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  0;....} else {..
20ca0 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
20cb0 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28  n = 0;......if (
20cc0 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
20cd0 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61  ...memcpy(pSigna
20ce0 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69  ture, sigbuf, si
20cf0 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  gbuflen);.......
20d00 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
20d10 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a   1;.....}......*
20d20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
20d30 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09  = sigbuflen;....
20d40 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
20d50 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
20d60 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48  k;...case CKM_SH
20d70 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  A1_RSA_PKCS:....
20d80 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 69 6e  /* Accumulate in
20d90 74 6f 20 61 20 53 48 41 31 20 68 61 73 68 20 2a  to a SHA1 hash *
20da0 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  /....cackey_mute
20db0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20dc0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41  biglock);.....CA
20dd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20de0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
20df0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20e00 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
20e10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20e20 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09  SUPPORTED);.....
20e30 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
20e40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20e50 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  D);....break;..}
20e60 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65  ...if (terminate
20e70 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63  _sign) {...if (c
20e80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20e90 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
20ea0 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  f) {....free(cac
20eb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20ec0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
20ed0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
20ee0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20ef0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  n].sign_active =
20f00 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
20f10 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20f20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
20f30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
20f40 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
20f50 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20f60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20f70 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
20f80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
20f90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
20fa0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
20fb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20fc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22  F("Returning %i"
20fd0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
20fe0 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
20ff0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
21000 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
21010 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
21020 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
21030 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
21040 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
21050 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
21060 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
21070 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
21080 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
21090 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
210a0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
210b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
210c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
210d0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
210e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
210f0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
21100 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
21110 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
21120 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
21130 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
21140 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
21150 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
21160 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21170 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
21180 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21190 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
211a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
211b0 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
211c0 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  er)(CK_SESSION_H
211d0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
211e0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
211f0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
21200 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
21210 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
21220 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
21230 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
21240 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21250 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21260 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21270 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
21280 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21290 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
212a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
212b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
212c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
212d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
212e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
212f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21300 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21310 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
21320 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21330 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
21340 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
21350 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21360 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
21370 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
21380 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f  _VerifyInit)(CK_
21390 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
213a0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
213b0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
213c0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
213d0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
213e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
213f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21400 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21410 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
21420 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21430 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21440 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21450 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21460 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21470 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
21480 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21490 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
214a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
214b0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
214c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
214d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
214e0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
214f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21500 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
21510 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
21520 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53  _Verify)(CK_SESS
21530 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
21540 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
21550 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
21560 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
21570 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
21580 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
21590 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
215a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
215b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
215c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
215d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
215e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
215f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21600 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21610 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21620 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21630 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
21640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21650 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21660 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21670 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
21680 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21690 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
216a0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
216b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
216c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
216d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
216e0 5f 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  _VerifyUpdate)(C
216f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
21700 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
21710 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
21720 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
21730 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
21740 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
21750 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
21760 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
21770 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21780 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21790 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
217a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
217b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
217c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
217d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
217e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
217f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
21800 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
21810 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
21820 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
21830 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
21840 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21850 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
21860 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
21870 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61  RV, C_VerifyFina
21880 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
21890 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
218a0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
218b0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
218c0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
218d0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
218e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
218f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
21900 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
21910 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21920 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21930 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21940 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21950 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21960 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21980 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21990 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
219a0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
219b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
219c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
219d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
219e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
219f0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
21a00 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21a10 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  , C_VerifyRecove
21a20 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  rInit)(CK_SESSIO
21a30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
21a40 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
21a50 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
21a60 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
21a70 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
21a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
21a90 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
21aa0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
21ab0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
21ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21ad0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
21ae0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
21af0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
21b00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
21b10 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
21b20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21b30 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
21b40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21b50 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
21b60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21b70 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
21b80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21b90 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
21ba0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21bb0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
21bc0 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53  yRecover)(CK_SES
21bd0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
21be0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
21bf0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
21c00 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
21c10 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  reLen, CK_BYTE_P
21c20 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
21c30 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65  NG_PTR pulDataLe
21c40 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
21c50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
21c60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
21c70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
21c80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21c90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21ca0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
21cb0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21cc0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
21cd0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
21ce0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
21cf0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
21d00 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
21d10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
21d20 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
21d30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21d40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
21d50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21d60 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
21d70 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
21d80 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63  _RV, C_DigestEnc
21d90 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
21da0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
21db0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
21dc0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
21dd0 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
21de0 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
21df0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
21e00 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
21e10 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
21e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21e30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21e40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21e50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
21e60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21e70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21e80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21e90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21ea0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21eb0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
21ec0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21ed0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21ee0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21ef0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
21f00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21f10 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
21f20 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
21f30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21f40 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
21f50 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
21f60 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
21f70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
21f80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
21f90 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
21fa0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
21fb0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
21fc0 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
21fd0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
21fe0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
21ff0 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
22000 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
22010 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
22020 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
22030 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22050 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22060 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22070 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22080 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22090 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
220a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
220b0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
220c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
220d0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
220e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
220f0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
22100 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22110 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
22120 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
22130 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45  N(CK_RV, C_SignE
22140 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
22150 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
22160 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
22170 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
22180 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
22190 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
221a0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
221b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
221c0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
221d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
221e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
221f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22200 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22220 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22230 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22240 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22250 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22260 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22280 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22290 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
222a0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
222b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
222c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
222d0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
222e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
222f0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
22300 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22310 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79   C_DecryptVerify
22320 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
22330 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
22340 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
22350 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
22360 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
22370 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
22380 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
22390 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
223a0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
223b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
223c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
223d0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
223e0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
223f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22400 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22410 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22420 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22430 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22440 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
22450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22460 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
22470 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22480 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
22490 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
224a0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
224b0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
224c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
224d0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
224e0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
224f0 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53  erateKey)(CK_SES
22500 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
22510 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
22520 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
22530 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  m, CK_ATTRIBUTE_
22540 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
22550 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
22560 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
22570 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
22580 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22590 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
225a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
225b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
225c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
225d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
225e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
225f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22600 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22610 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
22620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22630 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22640 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22650 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
22660 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22670 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
22680 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
22690 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
226a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
226b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
226c0 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72  _GenerateKeyPair
226d0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
226e0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
226f0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
22700 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54  Mechanism, CK_AT
22710 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 62  TRIBUTE_PTR pPub
22720 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20  licKeyTemplate, 
22730 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69  CK_ULONG ulPubli
22740 63 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  cKeyAttributeCou
22750 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  nt, CK_ATTRIBUTE
22760 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 79  _PTR pPrivateKey
22770 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
22780 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41  NG ulPrivateKeyA
22790 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
227a0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
227b0 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c  PTR phPublicKey,
227c0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
227d0 45 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 4b  E_PTR phPrivateK
227e0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
227f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22800 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
22810 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
22820 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22830 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22840 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
22850 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22860 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
22870 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
22880 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22890 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
228a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
228b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
228c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
228d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
228e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
228f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22900 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
22910 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22920 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29  K_RV, C_WrapKey)
22930 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
22940 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
22950 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
22960 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
22970 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70  ECT_HANDLE hWrap
22980 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  pingKey, CK_OBJE
22990 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20  CT_HANDLE hKey, 
229a0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61  CK_BYTE_PTR pWra
229b0 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e  ppedKey, CK_ULON
229c0 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 64  G_PTR pulWrapped
229d0 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  KeyLen) {..CACKE
229e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
229f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
22a00 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
22a10 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
22a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22a30 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
22a40 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
22a50 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
22a60 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
22a70 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
22a80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22a90 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
22aa0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22ab0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
22ac0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22ad0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
22ae0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22af0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
22b00 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
22b10 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72  ON(CK_RV, C_Unwr
22b20 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  apKey)(CK_SESSIO
22b30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
22b40 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
22b50 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
22b60 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
22b70 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c   hUnwrappingKey,
22b80 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72   CK_BYTE_PTR pWr
22b90 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f  appedKey, CK_ULO
22ba0 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c  NG ulWrappedKeyL
22bb0 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  en, CK_ATTRIBUTE
22bc0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
22bd0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69  CK_ULONG ulAttri
22be0 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
22bf0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
22c00 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
22c10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
22c20 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
22c30 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
22c40 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22c50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22c60 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22c70 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22c80 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22c90 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22ca0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
22cb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
22cc0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
22cd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22ce0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
22cf0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22d00 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
22d10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22d20 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
22d30 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
22d40 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76  N(CK_RV, C_Deriv
22d50 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  eKey)(CK_SESSION
22d60 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
22d70 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
22d80 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
22d90 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
22da0 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54  hBaseKey, CK_ATT
22db0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
22dc0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
22dd0 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  lAttributeCount,
22de0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
22df0 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
22e00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22e10 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22e20 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22e30 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22e40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22e50 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22e60 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22e70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22e80 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22e90 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
22ea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22eb0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22ec0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22ed0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
22ee0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22ef0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
22f00 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
22f10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22f20 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22f30 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22f40 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f  _SeedRandom)(CK_
22f50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
22f60 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
22f70 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55  _PTR pSeed, CK_U
22f80 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20  LONG ulSeedLen) 
22f90 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
22fa0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
22fb0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
22fc0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
22fd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22fe0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
22ff0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
23000 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23010 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
23020 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
23030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23040 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23050 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23060 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
23070 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
23080 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
23090 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
230a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
230b0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
230c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
230d0 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  , C_GenerateRand
230e0 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
230f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
23100 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e  CK_BYTE_PTR pRan
23110 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  domData, CK_ULON
23120 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b  G ulRandomLen) {
23130 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23140 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
23150 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
23160 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
23170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23180 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
23190 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
231a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
231b0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
231c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
231d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
231e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
231f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23200 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
23210 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
23220 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
23230 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
23240 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23250 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63  D);.}../* Deprec
23260 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
23270 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
23280 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
23290 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28  FunctionStatus)(
232a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
232b0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
232c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
232d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
232e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
232f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23300 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23310 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c  _PARALLEL (%i)",
23320 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
23330 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72  T_PARALLEL);...r
23340 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
23350 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
23360 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68  ;...hSession = h
23370 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72  Session; /* Supr
23380 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
23390 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
233a0 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20  ../* Deprecated 
233b0 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44  Function */.CK_D
233c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
233d0 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75  K_RV, C_CancelFu
233e0 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  nction)(CK_SESSI
233f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
23400 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  on) {..CACKEY_DE
23410 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
23420 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ed.");...CACKEY_
23430 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23440 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
23450 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
23460 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  L (%i)", CKR_FUN
23470 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
23480 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  EL);...return(CK
23490 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
234a0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73  ARALLEL);...hSes
234b0 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b  sion = hSession;
234c0 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
234d0 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
234e0 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46  ing */.}..CK_DEF
234f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23500 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
23510 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49  nList)(CK_FUNCTI
23520 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20  ON_LIST_PTR_PTR 
23530 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20  ppFunctionList) 
23540 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c  {..CK_FUNCTION_L
23550 49 53 54 5f 50 54 52 20 70 46 75 6e 63 74 69 6f  IST_PTR pFunctio
23560 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  nList;...CACKEY_
23570 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23580 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
23590 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d  pFunctionList ==
235a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
235b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
235c0 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f  Error. ppFunctio
235d0 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29  nList is NULL.")
235e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
235f0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
23600 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  .}...pFunctionLi
23610 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  st = malloc(size
23620 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73  of(*pFunctionLis
23630 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  t));...pFunction
23640 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61  List->version.ma
23650 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  jor = ((CACKEY_C
23660 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
23670 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30  CODE) >> 16) & 0
23680 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  xff;..pFunctionL
23690 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e  ist->version.min
236a0 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
236b0 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
236c0 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66  ODE) >> 8) & 0xf
236d0 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  f;...pFunctionLi
236e0 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65  st->C_Initialize
236f0 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b   = C_Initialize;
23700 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
23710 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f  >C_Finalize = C_
23720 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63  Finalize;..pFunc
23730 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49  tionList->C_GetI
23740 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b  nfo = C_GetInfo;
23750 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
23760 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d  >C_GetSlotList =
23770 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a   C_GetSlotList;.
23780 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
23790 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20  C_GetSlotInfo = 
237a0 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09  C_GetSlotInfo;..
237b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
237c0 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20  _GetTokenInfo = 
237d0 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a  C_GetTokenInfo;.
237e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
237f0 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65  C_WaitForSlotEve
23800 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c  nt = C_WaitForSl
23810 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74  otEvent;..pFunct
23820 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
23830 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f  chanismList = C_
23840 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
23850 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
23860 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  ->C_GetMechanism
23870 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68  Info = C_GetMech
23880 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e  anismInfo;..pFun
23890 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
238a0 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54  tToken = C_InitT
238b0 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  oken;..pFunction
238c0 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20  List->C_InitPIN 
238d0 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46  = C_InitPIN;..pF
238e0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
238f0 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e  etPIN = C_SetPIN
23900 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
23910 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20  ->C_OpenSession 
23920 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b  = C_OpenSession;
23930 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
23940 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20  >C_CloseSession 
23950 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  = C_CloseSession
23960 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
23970 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73  ->C_CloseAllSess
23980 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c  ions = C_CloseAl
23990 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e  lSessions;..pFun
239a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
239b0 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f  SessionInfo = C_
239c0 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a  GetSessionInfo;.
239d0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
239e0 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
239f0 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61  ate = C_GetOpera
23a00 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e  tionState;..pFun
23a10 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74  ctionList->C_Set
23a20 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d  OperationState =
23a30 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_SetOperationS
23a40 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tate;..pFunction
23a50 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20  List->C_Login = 
23a60 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74  C_Login;..pFunct
23a70 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75  ionList->C_Logou
23a80 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70  t = C_Logout;..p
23a90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23aa0 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43  CreateObject = C
23ab0 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09  _CreateObject;..
23ac0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23ad0 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f  _CopyObject = C_
23ae0 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75  CopyObject;..pFu
23af0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
23b00 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f  stroyObject = C_
23b10 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09  DestroyObject;..
23b20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23b30 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d  _GetObjectSize =
23b40 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65   C_GetObjectSize
23b50 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
23b60 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74 65  ->C_GetAttribute
23b70 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74  Value = C_GetAtt
23b80 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46  ributeValue;..pF
23b90 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
23ba0 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
23bb0 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75 74   = C_SetAttribut
23bc0 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69  eValue;..pFuncti
23bd0 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
23be0 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69  jectsInit = C_Fi
23bf0 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09  ndObjectsInit;..
23c00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23c10 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43  _FindObjects = C
23c20 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70  _FindObjects;..p
23c30 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23c40 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c  FindObjectsFinal
23c50 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
23c60 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
23c70 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
23c80 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74  Init = C_Encrypt
23c90 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
23ca0 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20  List->C_Encrypt 
23cb0 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46  = C_Encrypt;..pF
23cc0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
23cd0 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
23ce0 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  _EncryptUpdate;.
23cf0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
23d00 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d  C_EncryptFinal =
23d10 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b   C_EncryptFinal;
23d20 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
23d30 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d  >C_DecryptInit =
23d40 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a   C_DecryptInit;.
23d50 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
23d60 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65  C_Decrypt = C_De
23d70 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f  crypt;..pFunctio
23d80 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
23d90 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79  Update = C_Decry
23da0 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
23db0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
23dc0 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63  yptFinal = C_Dec
23dd0 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  ryptFinal;..pFun
23de0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
23df0 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65  estInit = C_Dige
23e00 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  stInit;..pFuncti
23e10 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
23e20 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46   = C_Digest;..pF
23e30 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
23e40 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
23e50 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70  DigestUpdate;..p
23e60 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23e70 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69  DigestKey = C_Di
23e80 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74  gestKey;..pFunct
23e90 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
23ea0 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73  tFinal = C_Diges
23eb0 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
23ec0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e  onList->C_SignIn
23ed0 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b  it = C_SignInit;
23ee0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
23ef0 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e  >C_Sign = C_Sign
23f00 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
23f10 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d  ->C_SignUpdate =
23f20 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09   C_SignUpdate;..
23f30 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23f40 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53  _SignFinal = C_S
23f50 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  ignFinal;..pFunc
23f60 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
23f70 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f  RecoverInit = C_
23f80 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b  SignRecoverInit;
23f90 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
23fa0 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d  >C_SignRecover =
23fb0 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a   C_SignRecover;.
23fc0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
23fd0 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43  C_VerifyInit = C
23fe0 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46  _VerifyInit;..pF
23ff0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
24000 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79  erify = C_Verify
24010 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24020 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61 74 65  ->C_VerifyUpdate
24030 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64 61 74   = C_VerifyUpdat
24040 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
24050 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c  t->C_VerifyFinal
24060 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c   = C_VerifyFinal
24070 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24080 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  ->C_VerifyRecove
24090 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79  rInit = C_Verify
240a0 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46  RecoverInit;..pF
240b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
240c0 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43  erifyRecover = C
240d0 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a  _VerifyRecover;.
240e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
240f0 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55  C_DigestEncryptU
24100 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74  pdate = C_Digest
24110 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
24120 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
24130 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
24140 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74  date = C_Decrypt
24150 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70  DigestUpdate;..p
24160 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
24170 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
24180 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70  e = C_SignEncryp
24190 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
241a0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
241b0 70 74 56 65 72 69 66 79 55 70 64 61 74 65 20 3d  ptVerifyUpdate =
241c0 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79   C_DecryptVerify
241d0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
241e0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61  onList->C_Genera
241f0 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61  teKey = C_Genera
24200 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  teKey;..pFunctio
24210 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74  nList->C_Generat
24220 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e  eKeyPair = C_Gen
24230 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70  erateKeyPair;..p
24240 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
24250 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70  WrapKey = C_Wrap
24260 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
24270 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79  ist->C_UnwrapKey
24280 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a   = C_UnwrapKey;.
24290 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
242a0 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f  C_DeriveKey = C_
242b0 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e  DeriveKey;..pFun
242c0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65  ctionList->C_See
242d0 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64  dRandom = C_Seed
242e0 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69  Random;..pFuncti
242f0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61  onList->C_Genera
24300 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e  teRandom = C_Gen
24310 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46  erateRandom;..pF
24320 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
24330 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
24340 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e   = C_GetFunction
24350 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69  Status;..pFuncti
24360 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c  onList->C_Cancel
24370 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e  Function = C_Can
24380 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46  celFunction;..pF
24390 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
243a0 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  etFunctionList =
243b0 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69   C_GetFunctionLi
243c0 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f  st;...*ppFunctio
243d0 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74 69 6f  nList = pFunctio
243e0 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  nList;...CACKEY_
243f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24400 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
24410 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
24420 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
24430 0a 7d 0a 0a                                      .}..