Hex Artifact Content

Artifact 6b8855e22d625e0df37a0a5fe5cf8f7a7f492b6e:


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 7d 3b  *certificate;.};
36d0: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
36e0: 69 64 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75  identity {..stru
36f0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
3700: 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
3710: 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54  entity;...CK_ATT
3720: 52 49 42 55 54 45 20 2a 61 74 74 72 69 62 75 74  RIBUTE *attribut
3730: 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74  es;..CK_ULONG at
3740: 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a  tributes_count;.
3750: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
3760: 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74  y_session {..int
3770: 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c   active;...CK_SL
3780: 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09  OT_ID slotID;...
3790: 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a  CK_STATE state;.
37a0: 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b  .CK_FLAGS flags;
37b0: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76  ..CK_ULONG ulDev
37c0: 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f  iceError;..CK_VO
37d0: 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74  ID_PTR pApplicat
37e0: 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20  ion;..CK_NOTIFY 
37f0: 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74  Notify;...struct
3800: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
3810: 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
3820: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
3830: 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a  ntities_count;..
3840: 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69  .int search_acti
3850: 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ve;..CK_ATTRIBUT
3860: 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71 75 65  E_PTR search_que
3870: 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65  ry;..CK_ULONG se
3880: 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
3890: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
38a0: 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b   search_curr_id;
38b0: 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69  ...int sign_acti
38c0: 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53  ve;..CK_MECHANIS
38d0: 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68  M_TYPE sign_mech
38e0: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f  anism;..CK_BYTE_
38f0: 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75  PTR sign_buf;..u
3900: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67  nsigned long sig
3910: 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67  n_buflen;..unsig
3920: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75  ned long sign_bu
3930: 66 75 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63  fused;..struct c
3940: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
3950: 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a  sign_identity;..
3960: 09 69 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74  .int decrypt_act
3970: 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49  ive;..CK_MECHANI
3980: 53 4d 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f  SM_TYPE decrypt_
3990: 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56  mechanism;..CK_V
39a0: 4f 49 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f  OID_PTR decrypt_
39b0: 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55  mech_parm;..CK_U
39c0: 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63  LONG decrypt_mec
39d0: 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75  h_parmlen;..stru
39e0: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
39f0: 74 79 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e  ty *decrypt_iden
3a00: 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  tity;.};..struct
3a10: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09   cackey_slot {..
3a20: 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 63 68  int active;...ch
3a30: 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 3b  ar *pcsc_reader;
3a40: 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72 64  ...int pcsc_card
3a50: 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41  _connected;..SCA
3a60: 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63 61  RDHANDLE pcsc_ca
3a70: 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61  rd;...int transa
3a80: 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 0a 09 69  ction_depth;...i
3a90: 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 7d  nt slot_reset;.}
3aa0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
3ab0: 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  {..CACKEY_TLV_AP
3ac0: 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31  P_GENERIC = 0x01
3ad0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  ,..CACKEY_TLV_AP
3ae0: 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32  P_SKI     = 0x02
3af0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  ,..CACKEY_TLV_AP
3b00: 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34  P_PKI     = 0x04
3b10: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70  .} cackey_tlv_ap
3b20: 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20  ptype;..typedef 
3b30: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54  enum {..CACKEY_T
3b40: 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c  LV_OBJID_GENERAL
3b50: 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32  INFO       = 0x2
3b60: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
3b70: 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e  _OBJID_PROPERSON
3b80: 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30  ALINFO   = 0x210
3b90: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
3ba0: 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52  BJID_ACCESSCONTR
3bb0: 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c  OL     = 0x3000,
3bc0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3bd0: 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20  ID_LOGIN        
3be0: 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09       = 0x4000,..
3bf0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3c00: 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20  _CARDINFO       
3c10: 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41     = 0x5000,..CA
3c20: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42  CKEY_TLV_OBJID_B
3c30: 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20 20 20  IOMETRICS       
3c40: 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b   = 0x6000,..CACK
3c50: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47  EY_TLV_OBJID_DIG
3c60: 49 54 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d  ITALSIGCERT    =
3c70: 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x7000,..CACKEY
3c80: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
3c90: 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30  ERSON        = 0
3ca0: 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x0200,..CACKEY_T
3cb0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e  LV_OBJID_CAC_BEN
3cc0: 45 46 49 54 53 20 20 20 20 20 20 3d 20 30 78 30  EFITS      = 0x0
3cd0: 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  202,..CACKEY_TLV
3ce0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52  _OBJID_CAC_OTHER
3cf0: 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30  BENEFITS = 0x020
3d00: 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  3,..CACKEY_TLV_O
3d10: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e  BJID_CAC_PERSONN
3d20: 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c  EL     = 0x0201,
3d30: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3d40: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20  ID_CAC_PKICERT  
3d50: 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20       = 0x02FE.} 
3d60: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
3d70: 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  tid;..typedef en
3d80: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53  um {..CACKEY_PCS
3d90: 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
3da0: 20 20 20 20 3d 20 32 2c 0a 09 43 41 43 4b 45 59      = 2,..CACKEY
3db0: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53  _PCSC_S_TOKENABS
3dc0: 45 4e 54 20 20 20 20 20 3d 20 31 2c 0a 09 43 41  ENT     = 1,..CA
3dd0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c              = 0,
3df0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
3e00: 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20  GENERIC         
3e10: 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -1,..CACKEY_PC
3e20: 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20  SC_E_BADPIN     
3e30: 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b       = -2,..CACK
3e40: 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
3e50: 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a            = -3,.
3e60: 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73  } cackey_ret;..s
3e70: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
3e80: 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69  _cardurl {..unsi
3e90: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20  gned char       
3ea0: 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79   rid[5];..cackey
3eb0: 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61  _tlv_apptype   a
3ec0: 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  pptype;..cackey_
3ed0: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62  tlv_objectid  ob
3ee0: 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f  jectid;..cackey_
3ef0: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70  tlv_objectid  ap
3f00: 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  pid;..unsigned c
3f10: 68 61 72 20 20 20 20 20 20 20 20 70 69 6e 69 64  har        pinid
3f20: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
3f30: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a  key_tlv_entity;.
3f40: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
3f50: 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74  v_entity {..uint
3f60: 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74  8_t tag;..size_t
3f70: 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e   length;...union
3f80: 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65   {...void *value
3f90: 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b 65  ;...struct cacke
3fa0: 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76  y_tlv_cardurl *v
3fb0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09  alue_cardurl;...
3fc0: 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79  uint8_t value_by
3fd0: 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74  te;..};...struct
3fe0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
3ff0: 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f  ty *_next;.};../
4000: 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20  * CACKEY Global 
4010: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69  Handles */.stati
4020: 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62  c void *cackey_b
4030: 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73  iglock = NULL;.s
4040: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
4050: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b  key_session cack
4060: 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d  ey_sessions[128]
4070: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
4080: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b  cackey_slot cack
4090: 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73  ey_slots[128];.s
40a0: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
40b0: 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30  _initialized = 0
40c0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ;.static int cac
40d0: 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
40e0: 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49   = 0;.CK_C_INITI
40f0: 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65  ALIZE_ARGS cacke
4100: 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50 43 53 43  y_args;../* PCSC
4110: 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20   Global Handles 
4120: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52  */.static LPSCAR
4130: 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f  DCONTEXT cackey_
4140: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
4150: 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  LL;..static unsi
4160: 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79  gned long cackey
4170: 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64  _getversion(void
4180: 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69  ) {..static unsi
4190: 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c  gned long retval
41a0: 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65   = 255;..unsigne
41b0: 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30  d long major = 0
41c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
41d0: 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61   minor = 0;..cha
41e0: 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e  r *major_str = N
41f0: 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f  ULL;..char *mino
4200: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  r_str = NULL;...
4210: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4220: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
4230: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20  ..if (retval != 
4240: 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  255) {...CACKEY_
4250: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
4260: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63  turning 0x%lx (c
4270: 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c  ached).", retval
4280: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74  );....return(ret
4290: 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  val);..}...retva
42a0: 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50  l = 0;..#ifdef P
42b0: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20  ACKAGE_VERSION. 
42c0: 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72         major_str
42d0: 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49   = PACKAGE_VERSI
42e0: 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73  ON;..if (major_s
42f0: 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d  tr) {..        m
4300: 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d  ajor = strtoul(m
4310: 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72  ajor_str, &minor
4320: 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66  _str, 10);....if
4330: 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09   (minor_str) {..
4340: 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75  ..minor = strtou
4350: 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c  l(minor_str + 1,
4360: 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a   NULL, 10);...}.
4370: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d  .}...retval = (m
4380: 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d  ajor << 16) | (m
4390: 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64  inor << 8);.#end
43a0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
43b0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
43c0: 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76  ing 0x%lx", retv
43d0: 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
43e0: 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f  tval);.}../* PC/
43f0: 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74  SC Related Funct
4400: 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59  ions */./*. * SY
4410: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f  NPOSIS. *     vo
4420: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  id cackey_slots_
4430: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76  disconnect_all(v
4440: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
4450: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
4460: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
4470: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
4480: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
4490: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
44a0: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72  n disconnects fr
44b0: 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a  om all cards.. *
44c0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
44d0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69   cackey_slots_di
44e0: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69  sconnect_all(voi
44f0: 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  d) {..uint32_t i
4500: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
4510: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
4520: 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78  d.");...for (idx
4530: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
4540: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
4550: 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
4560: 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
4570: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
4580: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
4590: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
45a0: 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ed) {....CACKEY_
45b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
45c0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c  ardDisconnect(%l
45d0: 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73  u) called", (uns
45e0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29  igned long) idx)
45f0: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
4600: 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f  nnect(cackey_slo
4610: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72  ts[idx].pcsc_car
4620: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
4630: 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  ARD);...}....cac
4640: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
4650: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
4660: 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ed = 0;...cackey
4670: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
4680: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
4690: 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  0;....if (cackey
46a0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
46b0: 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ve) {....CACKEY_
46c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
46d0: 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f  rking active slo
46e0: 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72  t %lu as being r
46f0: 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64  eset", (unsigned
4700: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d   long) idx);...}
4710: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
4720: 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  [idx].slot_reset
4730: 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45   = 1;..}...CACKE
4740: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4750: 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72  Returning");...r
4760: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
4770: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
4780: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
4790: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76  y_pcsc_connect(v
47a0: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
47b0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
47c0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
47d0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
47e0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
47f0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
4800: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
4810: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
4820: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
4830: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
4840: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63   function connec
4850: 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20  ts to the PC/SC 
4860: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67  Connection Manag
4870: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 74  er and updates t
4880: 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c  he. *     global
4890: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
48a0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
48b0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  t cackey_pcsc_co
48c0: 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c  nnect(void) {..L
48d0: 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f  ONG scard_est_co
48e0: 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65  ntext_ret;.#ifde
48f0: 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41  f HAVE_SCARDISVA
4900: 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47  LIDCONTEXT..LONG
4910: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72   scard_isvalid_r
4920: 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  et;.#endif...CAC
4930: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
4940: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
4950: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
4960: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
4970: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
4980: 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73  andle = malloc(s
4990: 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63  izeof(*cackey_pc
49a0: 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69  sc_handle));...i
49b0: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
49c0: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
49d0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
49e0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
49f0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
4a00: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
4a10: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61  ailure");.....ca
4a20: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
4a30: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09  nnect_all();....
4a40: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
4a50: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
4a60: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
4a70: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
4a80: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
4a90: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09  t() called");...
4aa0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
4ab0: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74  t_ret = SCardEst
4ac0: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43  ablishContext(SC
4ad0: 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d  ARD_SCOPE_SYSTEM
4ae0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61  , NULL, NULL, ca
4af0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4b00: 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65  );...if (scard_e
4b10: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21  st_context_ret !
4b20: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
4b30: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
4b40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
4b50: 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c  l to SCardEstabl
4b60: 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65  ishContext faile
4b70: 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25  d (returned %s/%
4b80: 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  li), returning i
4b90: 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b  n failure", CACK
4ba0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
4bb0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
4bc0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
4bd0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
4be0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
4bf0: 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61  et);.....free(ca
4c00: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4c10: 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  );....cackey_pcs
4c20: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  c_handle = NULL;
4c30: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
4c40: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
4c50: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
4c60: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
4c70: 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  ERIC);...}..}..#
4c80: 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44  ifdef HAVE_SCARD
4c90: 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09  ISVALIDCONTEXT..
4ca0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4cb0: 4e 54 46 28 22 53 43 61 72 64 49 73 56 61 6c 69  NTF("SCardIsVali
4cc0: 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65  dContext() calle
4cd0: 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61  d");..scard_isva
4ce0: 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49  lid_ret = SCardI
4cf0: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63  sValidContext(*c
4d00: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
4d10: 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69  e);..if (scard_i
4d20: 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43  svalid_ret != SC
4d30: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
4d40: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4d50: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
4d60: 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  as become invali
4d70: 64 20 28 53 43 61 72 64 49 73 56 61 6c 69 64 43  d (SCardIsValidC
4d80: 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29  ontext = %s/%li)
4d90: 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65  , trying to re-e
4da0: 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41  stablish...", CA
4db0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4dc0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
4dd0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
4de0: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
4df0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a  _isvalid_ret);..
4e00: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4e10: 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61  RINTF("SCardEsta
4e20: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63  blishContext() c
4e30: 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64  alled");...scard
4e40: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4e50: 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73   = SCardEstablis
4e60: 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53  hContext(SCARD_S
4e70: 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c  COPE_SYSTEM, NUL
4e80: 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f  L, NULL, cackey_
4e90: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
4ea0: 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  if (scard_est_co
4eb0: 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41  ntext_ret != SCA
4ec0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
4ed0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4ee0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20  PRINTF("Call to 
4ef0: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
4f00: 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65  ntext failed (re
4f10: 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20  turned %s/%li), 
4f20: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
4f30: 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45  lure", CACKEY_DE
4f40: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
4f50: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65  R_TO_STR(scard_e
4f60: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c  st_context_ret),
4f70: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73   (long) scard_es
4f80: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a  t_context_ret);.
4f90: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
4fa0: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
4fb0: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  .cackey_pcsc_han
4fc0: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  dle = NULL;.....
4fd0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
4fe0: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
4ff0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5000: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
5010: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
5020: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61  DEBUG_PRINTF("Ha
5030: 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  ndle has been re
5040: 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a  -established");.
5050: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  .}.#endif...CACK
5060: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5070: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  "Sucessfully con
5080: 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c  nected to PC/SC,
5090: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75   returning in su
50a0: 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72  ccess");...retur
50b0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
50c0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
50d0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
50e0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
50f0: 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
5100: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
5110: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
5120: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
5130: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
5140: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
5150: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
5160: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
5170: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
5180: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
5190: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
51a0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f  s function disco
51b0: 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20  nnects from the 
51c0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
51d0: 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64   manager and upd
51e0: 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20  ates. *     the 
51f0: 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20  global handle.. 
5200: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
5210: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
5220: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76  csc_disconnect(v
5230: 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  oid) {..LONG sca
5240: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
5250: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
5260: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
5270: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  d.");...if (cack
5280: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
5290: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
52a0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
52b0: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64  _OK);..}...scard
52c0: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _rel_context_ret
52d0: 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43   = SCardReleaseC
52e0: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70  ontext(*cackey_p
52f0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69  csc_handle);...i
5300: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
5310: 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28  andle) {...free(
5320: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5330: 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f  le);.....cackey_
5340: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
5350: 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  LL;..}...if (sca
5360: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
5370: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
5380: 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72  CCESS) {...retur
5390: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
53a0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72  GENERIC);..}...r
53b0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
53c0: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
53d0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
53e0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
53f0: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
5400: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
5410: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
5420: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
5430: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
5440: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
5450: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
5460: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
5470: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
5480: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
5490: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
54a0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
54b0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
54c0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
54d0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
54e0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
54f0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
5500: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
5510: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
5520: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
5530: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73  ..cackey_ret pcs
5540: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
5550: 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a  DWORD protocol;.
5560: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e  .LONG scard_conn
5570: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
5580: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
5590: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
55a0: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  lot) {...CACKEY_
55b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
55c0: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69  valid slot speci
55d0: 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  fied, returning 
55e0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
55f0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5600: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
5610: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
5620: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
5630: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
5640: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
5650: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
5660: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
5670: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5680: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
5690: 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72   PC/SC failed, r
56a0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
56b0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
56c0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
56d0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
56e0: 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64   Connect to read
56f0: 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  er, if needed */
5700: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
5710: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
5720: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
5730: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
5740: 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c  Connect(%s) call
5750: 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  ed", slot->pcsc_
5760: 72 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64  reader);...scard
5770: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
5780: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
5790: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
57a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
57b0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
57c0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
57d0: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
57e0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
57f0: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
5800: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53  rd_conn_ret != S
5810: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
5820: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
5830: 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
5840: 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69  tion to card fai
5850: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
5860: 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64  n failure (SCard
5870: 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25  Connect() = %s/%
5880: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  li)", CACKEY_DEB
5890: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
58a0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f  _TO_STR(scard_co
58b0: 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  nn_ret), (long) 
58c0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b  scard_conn_ret);
58d0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
58e0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
58f0: 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d  C);...}....slot-
5900: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
5910: 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74  cted = 1;...slot
5920: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
5930: 70 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a 09 72 65  pth = 0;..}...re
5940: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
5950: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
5960: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
5970: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5980: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
5990: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
59a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
59b0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
59c0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
59d0: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
59e0: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
59f0: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
5a00: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
5a10: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
5a20: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
5a30: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
5a40: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
5a50: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
5a60: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
5a70: 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73   *     The trans
5a80: 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  action should be
5a90: 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e   terminated usin
5aa0: 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  g "cackey_end_tr
5ab0: 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a  ansaction". *. *
5ac0: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
5ad0: 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e  ret cackey_begin
5ae0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
5af0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
5b00: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
5b10: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
5b20: 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _ret;..LONG scar
5b30: 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43  d_trans_ret;...C
5b40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5b50: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
5b60: 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74  .cackey_conn_ret
5b70: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
5b80: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
5b90: 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  f (cackey_conn_r
5ba0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
5bb0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
5bc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5bd0: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
5be0: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
5bf0: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
5c00: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
5c10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
5c20: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
5c30: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
5c40: 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ++;...if (slot->
5c50: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
5c60: 68 20 3e 20 31 29 20 7b 0a 09 09 43 41 43 4b 45  h > 1) {...CACKE
5c70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5c80: 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72 61  Already in a tra
5c90: 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72  nsaction, perfor
5ca0: 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28  ming no action (
5cb0: 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69 29 22  new depth = %i)"
5cc0: 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  , slot->transact
5cd0: 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72  ion_depth);....r
5ce0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5cf0: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63  C_S_OK);..}...sc
5d00: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20  ard_trans_ret = 
5d10: 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61  SCardBeginTransa
5d20: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63  ction(slot->pcsc
5d30: 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61  _card);..if (sca
5d40: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20  rd_trans_ret != 
5d50: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
5d60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
5d70: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
5d80: 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61   to begin transa
5d90: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
5da0: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
5db0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5dc0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
5dd0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
5de0: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
5df0: 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73  ully began trans
5e00: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28  action on slot (
5e10: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  %s)", slot->pcsc
5e20: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75  _reader);...retu
5e30: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
5e40: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
5e50: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
5e60: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
5e70: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
5e80: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
5e90: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
5ea0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
5eb0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
5ec0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
5ed0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
5ee0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
5ef0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
5f00: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
5f10: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
5f20: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
5f30: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
5f40: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
5f50: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
5f60: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
5f70: 20 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65   requires "cacke
5f80: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
5f90: 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65  ion" to be calle
5fa0: 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73  d first. *. */.s
5fb0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
5fc0: 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e   cackey_end_tran
5fd0: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
5fe0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
5ff0: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
6000: 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43  trans_ret;...CAC
6010: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6020: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
6030: 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  f (!slot->pcsc_c
6040: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
6050: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6060: 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
6070: 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75  not connected, u
6080: 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61  nable to end tra
6090: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 0a 09 09 72  nsaction");....r
60a0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
60b0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
60c0: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
60d0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
60e0: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
60f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65  DEBUG_PRINTF("Te
6100: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e  rminating a tran
6110: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  saction that has
6120: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a   not begun!");..
6130: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6140: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6150: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
6160: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
6170: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
6180: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
6190: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
61a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61  EBUG_PRINTF("Tra
61b0: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
61c0: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74  in progress, not
61d0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d   terminating on-
61e0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
61f0: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20   (current depth 
6200: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
6210: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
6220: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
6230: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6240: 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74  C);..}...scard_t
6250: 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64  rans_ret = SCard
6260: 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  EndTransaction(s
6270: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
6280: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
6290: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72  );..if (scard_tr
62a0: 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ans_ret != SCARD
62b0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
62c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
62d0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65  NTF("Unable to e
62e0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nd transaction, 
62f0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
6300: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
6310: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6320: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
6330: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6340: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65  ("Sucessfully te
6350: 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63  rminated transac
6360: 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73  tion on slot (%s
6370: 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  )", slot->pcsc_r
6380: 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e  eader);...return
6390: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
63a0: 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52  K);.}../* APDU R
63b0: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73  elated Functions
63c0: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53   */./*. * SYNPOS
63d0: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
63e0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64  _ret cackey_send
63f0: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63  _apdu(struct cac
6400: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
6410: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
6420: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ass, unsigned ch
6430: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  ar instruction, 
6440: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
6450: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6460: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p2, unsigned cha
6470: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  r lc, unsigned c
6480: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
6490: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e  ned char le, uin
64a0: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
64b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
64c0: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
64d0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b   *respdata_len);
64e0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
64f0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
6500: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
6510: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
6520: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
6530: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
6540: 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20   char class. *  
6550: 20 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73         APDU Clas
6560: 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  s (GSCIS_CLASS_I
6570: 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f  SO7816 or GSCIS_
6580: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
6590: 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20  TFORM. *        
65a0: 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29   usually), (CLA)
65b0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
65c0: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63  ned char instruc
65d0: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  tion. *         
65e0: 41 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e  APDU Instruction
65f0: 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20   (INS). *. *    
6600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
6610: 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  1. *         APD
6620: 55 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50  U Parameter 1 (P
6630: 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  1). *. *     uns
6640: 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a  igned char p2. *
6650: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61           APDU Pa
6660: 72 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20  rameter 2 (P2). 
6670: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
6680: 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20  d char lc. *    
6690: 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68       APDU Length
66a0: 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29   of Content (Lc)
66b0: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20   -- this is the 
66c0: 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22  length of "data"
66d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61  . *         para
66e0: 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61  meter.  If "data
66f0: 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  " is specified a
6700: 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72  s NULL, this par
6710: 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20  ameter will. *  
6720: 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65         be ignore
6730: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
6740: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
6750: 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e  . *         Poin
6760: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f  ter to buffer to
6770: 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c   send.  It shoul
6780: 64 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20  d be "Lc" bytes 
6790: 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20  long.  If. *    
67a0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
67b0: 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c  s NULL, "Lc" wil
67c0: 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61  l not be sent, a
67d0: 6e 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77  nd this buffer w
67e0: 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20  ill be. *       
67f0: 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a    ignored.. *. *
6800: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
6810: 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20  ar le. *        
6820: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20   APDU Length of 
6830: 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29  Expectation (Le)
6840: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20   -- this is the 
6850: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a  length of the. *
6860: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65           expecte
6870: 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69  d reply.  If thi
6880: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
6890: 73 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  s 0 then it will
68a0: 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20   not. *         
68b0: 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20  be sent.. *. *  
68c0: 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73     uint16_t *res
68d0: 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20  pcode. *        
68e0: 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74   [OUT] Pointer t
68f0: 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44  o storage of APD
6900: 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e  U response code.
6910: 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20    If this is. * 
6920: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
6930: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  d as NULL, the r
6940: 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c  esponse code wil
6950: 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  l be discarded..
6960: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
6970: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
6980: 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  a. *         [OU
6990: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  T] Pointer to st
69a0: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65  orage of APDU re
69b0: 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66  sponse data.  If
69c0: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20   this is. *     
69d0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
69e0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f   NULL, the respo
69f0: 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65  nse data will be
6a00: 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a   discarded.  If.
6a10: 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22   *         the "
6a20: 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61  respdata_len" pa
6a30: 72 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69  rameter is speci
6a40: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
6a50: 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20  is buffer. *    
6a60: 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65       will not be
6a70: 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20   updated.. *. * 
6a80: 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70      size_t *resp
6a90: 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20  data_len. *     
6aa0: 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f      [IN, OUT] Po
6ab0: 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67  inter initialing
6ac0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6ad0: 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73  size of the "res
6ae0: 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20  pdata". *       
6af0: 20 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72    buffer.  Befor
6b00: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65  e returning, the
6b10: 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75   pointed to valu
6b20: 65 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  e is updated to 
6b30: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e  the. *         n
6b40: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
6b50: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75  ritten to the bu
6b60: 66 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69  ffer.  If this i
6b70: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20  s specified as. 
6b80: 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20  *         NULL, 
6b90: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  it will not be u
6ba0: 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73  pdated, and "res
6bb0: 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69  pdata" will be i
6bc0: 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20  gnored causing. 
6bd0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65  *         the re
6be0: 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62  sponse data to b
6bf0: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a  e discarded.. *.
6c00: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6c10: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6c20: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
6c30: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
6c40: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
6c50: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
6c60: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
6c70: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
6c80: 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63  tion will connec
6c90: 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43  t to the PC/SC C
6ca0: 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65  onnection Manage
6cb0: 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63  r via. *     cac
6cc0: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
6cd0: 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a  () if needed.. *
6ce0: 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20  . *     It will 
6cf0: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63  connect to the c
6d00: 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 65  ard in the reade
6d10: 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  r attached to th
6d20: 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70  e slot. *     sp
6d30: 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c  ecified.  It wil
6d40: 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74  l reconnect to t
6d50: 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20 63  he card if the c
6d60: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20  onnection. *    
6d70: 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20   goes away.. *. 
6d80: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
6d90: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64  _ret cackey_send
6da0: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63  _apdu(struct cac
6db0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
6dc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
6dd0: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ass, unsigned ch
6de0: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  ar instruction, 
6df0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
6e00: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6e10: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p2, unsigned cha
6e20: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  r lc, unsigned c
6e30: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
6e40: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e  ned char le, uin
6e50: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
6e60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6e70: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
6e80: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20   *respdata_len) 
6e90: 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72  {..uint8_t major
6ea0: 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09  _rc, minor_rc;..
6eb0: 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f  size_t bytes_to_
6ec0: 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61  copy, tmp_respda
6ed0: 74 61 5f 6c 65 6e 3b 0a 09 44 57 4f 52 44 20 70  ta_len;..DWORD p
6ee0: 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20  rotocol;..DWORD 
6ef0: 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c  xmit_len, recv_l
6f00: 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  en;..LONG scard_
6f10: 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f  xmit_ret, scard_
6f20: 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54  reconn_ret;..BYT
6f30: 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d  E xmit_buf[1024]
6f40: 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d  , recv_buf[1024]
6f50: 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e  ;..int pcsc_conn
6f60: 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65  ect_ret, pcsc_ge
6f70: 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20  tresp_ret;..int 
6f80: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
6f90: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6fa0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
6fb0: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
6fc0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
6fd0: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
6fe0: 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ied.");....retur
6ff0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
7000: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70  GENERIC);..}...p
7010: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
7020: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
7030: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
7040: 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
7050: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
7060: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
7070: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7080: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
7090: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
70a0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
70b0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
70c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
70d0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72  RIC);..}.../* Tr
70e0: 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f  ansmit */..xmit_
70f0: 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62  len = 0;..xmit_b
7100: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
7110: 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75   class;..xmit_bu
7120: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
7130: 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d  instruction;..xm
7140: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
7150: 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62  +] = p1;..xmit_b
7160: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
7170: 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20   p2;..if (data) 
7180: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  {...xmit_buf[xmi
7190: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09  t_len++] = lc;..
71a0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
71b0: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20  dx < lc; idx++) 
71c0: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
71d0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61  it_len++] = data
71e0: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  [idx];...}..}...
71f0: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20  if (le != 0x00) 
7200: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  {...xmit_buf[xmi
7210: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09  t_len++] = le;..
7220: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61  }.../* Begin Sma
7230: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
7240: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
7250: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
7260: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61  slot);...if (cla
7270: 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53  ss == GSCIS_CLAS
7280: 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73  S_ISO7816 && ins
7290: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49  truction == GSCI
72a0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26  S_INSTR_VERIFY &
72b0: 26 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20  & p1 == 0x00 && 
72c0: 70 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  p2 == 0x00) {...
72d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
72e0: 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44  NTF("Sending APD
72f0: 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22  U: <<censored>>"
7300: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43  );..} else {...C
7310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7320: 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50  TBUF("Sending AP
7330: 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20  DU:", xmit_buf, 
7340: 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  xmit_len);..}...
7350: 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  recv_len = sizeo
7360: 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63  f(recv_buf);..sc
7370: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
7380: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
7390: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
73a0: 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74  ARD_PCI_T0, xmit
73b0: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
73c0: 53 43 41 52 44 5f 50 43 49 5f 54 31 2c 20 72 65  SCARD_PCI_T1, re
73d0: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65  cv_buf, &recv_le
73e0: 6e 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 78  n);..if (scard_x
73f0: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
7400: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
7410: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7420: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
7430: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
7440: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
7450: 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41  ) = %s/%lx)", CA
7460: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
7470: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
7480: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
7490: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
74a0: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
74b0: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
74c0: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
74d0: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20   slot as having 
74e0: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 0a 09  been reset");...
74f0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
7500: 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
7510: 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74  slot->slot_reset
7520: 20 3d 20 31 3b 0a 0a 09 09 69 66 20 28 73 63 61   = 1;....if (sca
7530: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53  rd_xmit_ret == S
7540: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
7550: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
7560: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
7570: 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65  et required, ple
7580: 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a  ase hold...");..
7590: 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  ...scard_reconn_
75a0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e  ret = SCardRecon
75b0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
75c0: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52  card, SCARD_SHAR
75d0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
75e0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41  PROTOCOL_T0, SCA
75f0: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26  RD_RESET_CARD, &
7600: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66  protocol);....if
7610: 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72   (scard_reconn_r
7620: 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
7630: 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20  CCESS) {...../* 
7640: 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
7650: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
7660: 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
7670: 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
7680: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
7690: 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
76a0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
76b0: 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65  th--;......cacke
76c0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
76d0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
76e0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
76f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
7700: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
7710: 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 09  ransmitting");..
7720: 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  ...scard_xmit_re
7730: 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69  t = SCardTransmi
7740: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
7750: 64 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c  d, SCARD_PCI_T0,
7760: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
7770: 6c 65 6e 2c 20 53 43 41 52 44 5f 50 43 49 5f 54  len, SCARD_PCI_T
7780: 30 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65  0, recv_buf, &re
7790: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66  cv_len);......if
77a0: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
77b0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
77c0: 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ESS) {......CACK
77d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
77e0: 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69 6c  "Retransmit fail
77f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
7800: 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20 64   failure after d
7810: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65  isconnecting the
7820: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e   card (SCardTran
7830: 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c  smit = %s/%li)",
7840: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
7850: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
7860: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
7870: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
7880: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09  _xmit_ret);.....
7890: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
78a0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
78b0: 64 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  d, SCARD_RESET_C
78c0: 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  ARD);......slot-
78d0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
78e0: 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09  cted = 0;.......
78f0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
7900: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
7910: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
7920: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31  action_depth = 1
7930: 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65 6e  ;......cackey_en
7940: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
7950: 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  ot);.......retur
7960: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
7970: 47 45 4e 45 52 49 43 29 3b 0a 09 09 09 09 7d 0a  GENERIC);.....}.
7980: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
7990: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
79a0: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
79b0: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09  ng card");......
79c0: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
79d0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
79e0: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
79f0: 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63  D);.....slot->pc
7a00: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
7a10: 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45  d = 0;....../* E
7a20: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
7a30: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  nsaction */.....
7a40: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7a50: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
7a60: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
7a70: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
7a80: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7a90: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
7aa0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
7ab0: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
7ac0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7ad0: 43 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  C);....}...} els
7ae0: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
7af0: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
7b00: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
7b10: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
7b20: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
7b30: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53  _card, SCARD_RES
7b40: 45 54 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f  ET_CARD);....slo
7b50: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
7b60: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
7b70: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
7b80: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
7b90: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
7ba0: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
7bb0: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
7bc0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
7bd0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
7be0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
7bf0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
7c00: 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
7c10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7c20: 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  C);...}..}...CAC
7c30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
7c40: 55 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c  UF("Returned Val
7c50: 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20  ue:", recv_buf, 
7c60: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  recv_len);...if 
7c70: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b  (recv_len < 2) {
7c80: 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65  .../* Minimal re
7c90: 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73  sponse length is
7ca0: 20 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e   2 bytes, return
7cb0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a  ing in failure *
7cc0: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
7cd0: 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73  _PRINTF("Respons
7ce0: 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74  e too small, ret
7cf0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7d00: 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c  e (recv_len = %l
7d10: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
7d20: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
7d30: 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7d40: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7d50: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
7d60: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
7d70: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
7d80: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7d90: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  IC);..}.../* Det
7da0: 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f  ermine result co
7db0: 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20  de */..major_rc 
7dc0: 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f  = recv_buf[recv_
7dd0: 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72  len - 2];..minor
7de0: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
7df0: 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69  ecv_len - 1];..i
7e00: 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09  f (respcode) {..
7e10: 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61  .*respcode = (ma
7e20: 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d  jor_rc << 8) | m
7e30: 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a  inor_rc;..}.../*
7e40: 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20   Adjust message 
7e50: 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f  buffer */..recv_
7e60: 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41  len -= 2;.../* A
7e70: 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75  dd bytes to retu
7e80: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70  rn value */..tmp
7e90: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  _respdata_len = 
7ea0: 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61  0;..if (respdata
7eb0: 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e   && respdata_len
7ec0: 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61  ) {...tmp_respda
7ed0: 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61  ta_len = *respda
7ee0: 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73  ta_len;....bytes
7ef0: 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70  _to_copy = *resp
7f00: 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20  data_len;....if 
7f10: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65  (recv_len < byte
7f20: 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09  s_to_copy) {....
7f30: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
7f40: 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  recv_len;...}...
7f50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7f60: 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c  INTF("Copying %l
7f70: 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62  u bytes to the b
7f80: 75 66 66 65 72 22 2c 20 28 75 6e 73 69 67 6e 65  uffer", (unsigne
7f90: 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f  d long) bytes_to
7fa0: 5f 63 6f 70 79 29 3b 0a 0a 09 09 6d 65 6d 63 70  _copy);....memcp
7fb0: 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63 76  y(respdata, recv
7fc0: 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63  _buf, bytes_to_c
7fd0: 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61  opy);...respdata
7fe0: 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70   += bytes_to_cop
7ff0: 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f  y;....*respdata_
8000: 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63  len = bytes_to_c
8010: 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64  opy;...tmp_respd
8020: 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73  ata_len -= bytes
8030: 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73  _to_copy;..} els
8040: 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c  e {...if (recv_l
8050: 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  en != 0) {....CA
8060: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8070: 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79  F("Throwing away
8080: 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68   %lu bytes, nowh
8090: 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21  ere to put them!
80a0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
80b0: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09  g) recv_len);...
80c0: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72  }..}...if (major
80d0: 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09  _rc == 0x61) {..
80e0: 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52  ./* We need to R
80f0: 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  EAD */...CACKEY_
8100: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
8110: 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69 72  ffer read requir
8120: 65 64 22 29 3b 0a 0a 09 09 70 63 73 63 5f 67 65  ed");....pcsc_ge
8130: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b  tresp_ret = cack
8140: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
8150: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
8160: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
8170: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45  STR_GET_RESPONSE
8180: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c  , 0x00, 0x00, 0,
8190: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c   NULL, minor_rc,
81a0: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64   respcode, respd
81b0: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61  ata, &tmp_respda
81c0: 74 61 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 70  ta_len);...if (p
81d0: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
81e0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
81f0: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
8200: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
8210: 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65  uffer read faile
8220: 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e  d!  Returning in
8230: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
8240: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
8250: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
8260: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
8270: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
8280: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
8290: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
82a0: 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72  C);...}....if (r
82b0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
82c0: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  ..*respdata_len 
82d0: 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  += tmp_respdata_
82e0: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45  len;...}..../* E
82f0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
8300: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61  nsaction */...ca
8310: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
8320: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43  tion(slot);....C
8330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8340: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
8350: 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72   success (buffer
8360: 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22   read complete)"
8370: 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8380: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
8390: 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  }.../* End Smart
83a0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
83b0: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
83c0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
83d0: 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72  );...if (major_r
83e0: 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f  c == 0x90) {.../
83f0: 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43  * Success */...C
8400: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8410: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
8420: 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f   success (major_
8430: 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09  rc = 0x90)");...
8440: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8450: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a  CSC_S_OK);..}...
8460: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8470: 49 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72  INTF("APDU Retur
8480: 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65  ned an error, re
8490: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
84a0: 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  re");...return(C
84b0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
84c0: 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  ERIC);.}../*. * 
84d0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
84e0: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72  ssize_t cackey_r
84f0: 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63  ead_buffer(struc
8500: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8510: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
8520: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
8530: 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e  _t count, unsign
8540: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20  ed char t_or_v, 
8550: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
8560: 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  ffset);. *. * AR
8570: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
8580: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8590: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
85a0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
85b0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
85c0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
85d0: 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20  har *buffer. *  
85e0: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66         [OUT] Buf
85f0: 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  fer. *. *     si
8600: 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20  ze_t count. *   
8610: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
8620: 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74  bytes to attempt
8630: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20   to read. *. *  
8640: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
8650: 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20   t_or_v. *      
8660: 20 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d     Select the T-
8670: 62 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56  buffer (01) or V
8680: 2d 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20  -buffer (02) to 
8690: 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a  read from.  . *.
86a0: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e   *     size_t in
86b0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20  itial_offset. * 
86c0: 20 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20          Specify 
86d0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  the offset to be
86e0: 67 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f  gin the read fro
86f0: 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  m. *. *. * RETUR
8700: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
8710: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
8720: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
8730: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
8740: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
8750: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
8760: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
8770: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
8780: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61  ize_t cackey_rea
8790: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20  d_buffer(struct 
87a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
87b0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
87c0: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
87d0: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64   count, unsigned
87e0: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69   char t_or_v, si
87f0: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
8800: 73 65 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 6f  set) {..size_t o
8810: 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f  ffset = 0, max_o
8820: 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74  ffset, max_count
8830: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
8840: 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36   cmd[2];..uint16
8850: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e  _t respcode;..in
8860: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
8870: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8880: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
8890: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75  max_offset = cou
88a0: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  nt;..max_count =
88b0: 20 32 35 32 3b 0a 0a 09 69 66 20 28 74 5f 6f 72   252;...if (t_or
88c0: 5f 76 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f  _v != 1 && t_or_
88d0: 76 20 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b  v != 2) {...CACK
88e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
88f0: 22 49 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20  "Invalid T or V 
8900: 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
8910: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
8920: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
8930: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
8940: 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76  .cmd[0] = t_or_v
8950: 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ;...while (1) {.
8960: 09 09 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20  ..if (offset >= 
8970: 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09  max_offset) {...
8980: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8990: 49 4e 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f  INTF("Buffer too
89a0: 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e   small, returnin
89b0: 67 20 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e  g what we got...
89c0: 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ");.....break;..
89d0: 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61  .}....count = ma
89e0: 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65  x_offset - offse
89f0: 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e  t;...if (count >
8a00: 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09   max_count) {...
8a10: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  .count = max_cou
8a20: 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31  nt;...}....cmd[1
8a30: 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65  ] = count;....se
8a40: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
8a50: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
8a60: 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42  GSCIS_CLASS_GLOB
8a70: 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43  AL_PLATFORM, GSC
8a80: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
8a90: 46 46 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f  FFER, ((initial_
8aa0: 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29  offset + offset)
8ab0: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28   >> 8) & 0xff, (
8ac0: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b  initial_offset +
8ad0: 20 6f 66 66 73 65 74 29 20 26 20 30 78 66 66 2c   offset) & 0xff,
8ae0: 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d   sizeof(cmd), cm
8af0: 64 2c 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f  d, 0x00, &respco
8b00: 64 65 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66  de, buffer + off
8b10: 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 09 09  set, &count);...
8b20: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
8b30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8b40: 29 20 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63  ) {....if (respc
8b50: 6f 64 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b  ode == 0x6A86) {
8b60: 0a 09 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75  .....if (max_cou
8b70: 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09  nt == 1) {......
8b80: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
8b90: 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61  ..max_count = ma
8ba0: 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09  x_count / 2;....
8bb0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
8bc0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
8bd0: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
8be0: 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69  _send_apdu() fai
8bf0: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
8c00: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
8c10: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
8c20: 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f  ....offset += co
8c30: 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e  unt;....if (coun
8c40: 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b  t < max_count) {
8c50: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8c60: 5f 50 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72  _PRINTF("Short r
8c70: 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25  ead -- count = %
8c80: 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c  i, cmd[1] = %i",
8c90: 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69   (int) count, (i
8ca0: 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09  nt) cmd[1]);....
8cb0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
8cc0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
8cd0: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
8ce0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
8cf0: 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f  ..if (offset > _
8d00: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29  POSIX_SSIZE_MAX)
8d10: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
8d20: 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74  G_PRINTF("Offset
8d30: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
8d40: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
8d50: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
8d60: 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74  ax = %li, offset
8d70: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
8d80: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
8d90: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
8da0: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72  g) offset);....r
8db0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
8dc0: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
8dd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8de0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
8df0: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20  n success, read 
8e00: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73  %lu bytes", (uns
8e10: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73  igned long) offs
8e20: 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66  et);...return(of
8e30: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  fset);.}../*. * 
8e40: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
8e50: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8e60: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
8e70: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8e80: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
8e90: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
8ea0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20  ze_t aid_len);. 
8eb0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
8ec0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
8ed0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
8ee0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
8ef0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
8f00: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
8f10: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a  igned char *aid.
8f20: 20 2a 20 20 20 20 20 20 20 20 20 42 75 66 66 65   *         Buffe
8f30: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70  r containing App
8f40: 6c 65 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74  let ID to select
8f50: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
8f60: 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20  t aid_len. *    
8f70: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62       Number of b
8f80: 79 74 65 73 20 69 6e 20 74 68 65 20 22 61 69 64  ytes in the "aid
8f90: 22 20 28 41 70 70 6c 65 74 20 49 44 29 20 70 61  " (Applet ID) pa
8fa0: 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45  rameter. *. * RE
8fb0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
8fc0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
8fd0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
8fe0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
8ff0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9000: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
9010: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
9020: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
9030: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
9040: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
9050: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  plet(struct cack
9060: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
9070: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
9080: 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65  d, size_t aid_le
9090: 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  n) {..int send_r
90a0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
90b0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
90c0: 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
90d0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53  EBUG_PRINTBUF("S
90e0: 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a  electing applet:
90f0: 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29  ", aid, aid_len)
9100: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
9110: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
9120: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
9130: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
9140: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47  _INSTR_SELECT, G
9150: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
9160: 54 5f 41 50 50 4c 45 54 2c 20 30 78 30 43 2c 20  T_APPLET, 0x0C, 
9170: 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78  aid_len, aid, 0x
9180: 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  00, NULL, NULL, 
9190: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64  NULL);..if (send
91a0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
91b0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
91c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
91d0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  F("Failed to ope
91e0: 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e  n applet, return
91f0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
9200: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9210: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9220: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
9230: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
9240: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
9250: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
9260: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
9270: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
9280: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
9290: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
92a0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
92b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
92c0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
92d0: 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  t ef);. *. * ARG
92e0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
92f0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
9300: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
9310: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
9320: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
9330: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66       uint16_t ef
9340: 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d  . *         Elem
9350: 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65  ental File to se
9360: 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52  lect. *. * RETUR
9370: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
9380: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
9390: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
93a0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
93b0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
93c0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
93d0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
93e0: 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45  his selects an E
93f0: 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28  lementary File (
9400: 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75  EF) under the cu
9410: 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64  rrently selected
9420: 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65  . *     Dedicate
9430: 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20  d File (DF). *. 
9440: 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20  *     Typically 
9450: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  this is called a
9460: 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74  fter selecting t
9470: 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65  he correct Apple
9480: 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20  t (using. *     
9490: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
94a0: 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72  plet) for VM car
94b0: 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ds. *. */.static
94c0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
94d0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
94e0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
94f0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
9500: 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65  t ef) {..unsigne
9510: 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32  d char fid_buf[2
9520: 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  ];..int send_ret
9530: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
9540: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
9550: 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68  ");.../* Open th
9560: 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c  e elementary fil
9570: 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d  e */..fid_buf[0]
9580: 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30   = (ef >> 8) & 0
9590: 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d  xff;..fid_buf[1]
95a0: 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09   = ef & 0xff;...
95b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
95c0: 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66  NTF("Selecting f
95d0: 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e  ile: %04lx", (un
95e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29  signed long) ef)
95f0: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
9600: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
9610: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
9620: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
9630: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30  _INSTR_SELECT, 0
9640: 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f  x02, 0x0C, sizeo
9650: 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f  f(fid_buf), fid_
9660: 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  buf, 0x00, NULL,
9670: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69   NULL, NULL);..i
9680: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
9690: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
96a0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
96b0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
96c0: 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72   to open file, r
96d0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
96e0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
96f0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
9700: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
9710: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9720: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
9730: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b  selected file");
9740: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9750: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
9760: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
9770: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
9780: 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63  y_free_tlv(struc
9790: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
97a0: 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20  ity *root);. *. 
97b0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
97c0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
97d0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f  _tlv_entity *roo
97e0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f  t. *         Roo
97f0: 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73  t of the TLV lis
9800: 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69  t to start freei
9810: 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ng. *. * RETURN 
9820: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
9830: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
9840: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
9850: 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56  on frees the TLV
9860: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72   linked listed r
9870: 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20  eturned from. * 
9880: 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64      "cackey_read
9890: 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  _tlv". *. */.sta
98a0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
98b0: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
98c0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
98d0: 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75  y *root) {..stru
98e0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
98f0: 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78  tity *curr, *nex
9900: 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d  t;...if (root ==
9910: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
9920: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72  n;..}...for (cur
9930: 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20  r = root; curr; 
9940: 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09  curr = next) {..
9950: 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e  .next = curr->_n
9960: 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ext;....switch (
9970: 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09  curr->tag) {....
9980: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
9990: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73  CR_TABLE:....cas
99a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
99b0: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20  IFICATE:.....if 
99c0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a  (curr->value) {.
99d0: 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e  .....free(curr->
99e0: 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09  value);.....}...
99f0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
9a00: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
9a10: 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  RL:.....if (curr
9a20: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
9a30: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
9a40: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
9a50: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
9a60: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28  ak;...}....free(
9a70: 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  curr);..}...retu
9a80: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
9a90: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
9aa0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
9ab0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
9ac0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
9ad0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
9ae0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
9af0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
9b00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
9b10: 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  _entity *cackey_
9b20: 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20  read_tlv(struct 
9b30: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
9b40: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
9b50: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
9b60: 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f  curr_entity, *ro
9b70: 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74  ot = NULL, *last
9b80: 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e   = NULL;..unsign
9b90: 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66  ed char tlen_buf
9ba0: 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30  [2], tval_buf[10
9bb0: 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73  24], *tval;..uns
9bc0: 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f  igned char vlen_
9bd0: 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66  buf[2], vval_buf
9be0: 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09  [8192], *vval;..
9bf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
9c00: 6d 70 62 75 66 3b 0a 09 73 73 69 7a 65 5f 74 20  mpbuf;..ssize_t 
9c10: 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69  tlen, vlen;..ssi
9c20: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09  ze_t read_ret;..
9c30: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20  size_t offset_t 
9c40: 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20  = 0, offset_v = 
9c50: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  0;..unsigned cha
9c60: 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  r tag;..size_t l
9c70: 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41  ength;.#ifdef HA
9c80: 56 45 5f 4c 49 42 5a 0a 09 75 4c 6f 6e 67 66 20  VE_LIBZ..uLongf 
9c90: 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20  tmpbuflen;..int 
9ca0: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a  uncompress_ret;.
9cb0: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
9cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
9cd0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f  lled.");...read_
9ce0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
9cf0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74  d_buffer(slot, t
9d00: 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  len_buf, sizeof(
9d10: 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66  tlen_buf), 1, of
9d20: 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65  fset_t);..if (re
9d30: 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66  ad_ret != sizeof
9d40: 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09  (tlen_buf)) {...
9d50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9d60: 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64  NTF("Read failed
9d70: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
9d80: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9d90: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
9da0: 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66  tlen = (tlen_buf
9db0: 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e  [1] << 8) | tlen
9dc0: 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f  _buf[0];...read_
9dd0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
9de0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76  d_buffer(slot, v
9df0: 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  len_buf, sizeof(
9e00: 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66  vlen_buf), 2, of
9e10: 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65  fset_v);..if (re
9e20: 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66  ad_ret != sizeof
9e30: 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09  (vlen_buf)) {...
9e40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9e50: 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64  NTF("Read failed
9e60: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
9e70: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9e80: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
9e90: 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66  vlen = (vlen_buf
9ea0: 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e  [1] << 8) | vlen
9eb0: 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45  _buf[0];...CACKE
9ec0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9ed0: 54 61 67 20 4c 65 6e 67 74 68 20 3d 20 25 69 2c  Tag Length = %i,
9ee0: 20 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20   Value Length = 
9ef0: 25 69 22 2c 20 74 6c 65 6e 2c 20 76 6c 65 6e 29  %i", tlen, vlen)
9f00: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20  ;...offset_t += 
9f10: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20  2;..offset_v += 
9f20: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20  2;...if (tlen > 
9f30: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29  sizeof(tval_buf)
9f40: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9f50: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c  UG_PRINTF("Tag l
9f60: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72  ength is too lar
9f70: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ge, returning in
9f80: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
9f90: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
9fa0: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a  ..if (vlen > siz
9fb0: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b  eof(vval_buf)) {
9fc0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9fd0: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65  PRINTF("Value le
9fe0: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
9ff0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
a000: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
a010: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
a020: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
a030: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
a040: 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74  lot, tval_buf, t
a050: 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  len, 1, offset_t
a060: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
a070: 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41   != tlen) {...CA
a080: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a090: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
a0a0: 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65  d entire T-buffe
a0b0: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
a0c0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
a0d0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
a0e0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
a0f0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
a100: 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76  lot, vval_buf, v
a110: 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  len, 2, offset_v
a120: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
a130: 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41   != vlen) {...CA
a140: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a150: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
a160: 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65  d entire V-buffe
a170: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
a180: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
a190: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
a1a0: 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66  .tval = tval_buf
a1b0: 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62  ;..vval = vval_b
a1c0: 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e  uf;..while (tlen
a1d0: 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30   > 0 && vlen > 0
a1e0: 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61  ) {...tag = *tva
a1f0: 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74  l;...tval++;...t
a200: 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74  len--;....if (*t
a210: 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09  val == 0xff) {..
a220: 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c  ..length = (tval
a230: 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c  [2] << 8) | tval
a240: 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20  [1];....tval += 
a250: 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b  3;....tlen -= 3;
a260: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
a270: 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09  ength = *tval;..
a280: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65  ..tval++;....tle
a290: 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  n--;...}....CACK
a2a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a2b0: 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22  "Tag: %s (%02x)"
a2c0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
a2d0: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74  UNC_TAG_TO_STR(t
a2e0: 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  ag), (unsigned i
a2f0: 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b  nt) tag);...CACK
a300: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
a310: 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c  F("Value:", vval
a320: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75  , length);....cu
a330: 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  rr_entity = NULL
a340: 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29  ;...switch (tag)
a350: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
a360: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
a370: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
a380: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
a390: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
a3a0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
a3b0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d  alue_cardurl = m
a3c0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
a3d0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
a3e0: 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09  _cardurl));.....
a3f0: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74  .memcpy(curr_ent
a400: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
a410: 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35  rl->rid, vval, 5
a420: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
a430: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
a440: 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61  l->apptype = vva
a450: 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[5];.....curr_e
a460: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
a470: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d  durl->objectid =
a480: 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20   (vval[6] << 8) 
a490: 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63  | vval[7];.....c
a4a0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
a4b0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
a4c0: 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38   = (vval[8] << 8
a4d0: 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09  ) | vval[9];....
a4e0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
a4f0: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
a500: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
a510: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
a520: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
a530: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
a540: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
a550: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
a560: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
a570: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
a580: 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a  alloc(length);..
a590: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
a5a0: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
a5b0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
a5c0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
a5d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a5e0: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
a5f0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a600: 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66  ->value = tmpbuf
a610: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
a620: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
a630: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
a640: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
a650: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
a660: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
a670: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
a680: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  r_entity));.....
a690: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
a6a0: 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70  gth * 2;.....tmp
a6b0: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
a6c0: 62 75 66 6c 65 6e 29 3b 0a 0a 23 69 66 64 65 66  buflen);..#ifdef
a6d0: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 75   HAVE_LIBZ.....u
a6e0: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
a6f0: 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75  uncompress(tmpbu
a700: 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76  f, &tmpbuflen, v
a710: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
a720: 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
a730: 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret != Z_OK) {.
a740: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a750: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
a760: 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20   to decompress, 
a770: 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74  uncompress() ret
a780: 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f  urned %i -- reso
a790: 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20  rting to direct 
a7a0: 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73  copy", uncompres
a7b0: 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d  s_ret);.......tm
a7c0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
a7d0: 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  ;......memcpy(tm
a7e0: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
a7f0: 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  th);.....}......
a800: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a810: 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
a820: 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
a830: 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65  , tmpbuflen);.#e
a840: 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  lse.....CACKEY_D
a850: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73  EBUG_PRINTF("Mis
a860: 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72  sing ZLIB Suppor
a870: 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63  t, this certific
a880: 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73  ate is likely us
a890: 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09  eless...");.....
a8a0: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
a8b0: 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  gth;.....memcpy(
a8c0: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
a8d0: 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ngth);.#endif...
a8e0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a8f0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
a900: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
a910: 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  th = tmpbuflen;.
a920: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
a930: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
a940: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a950: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
a960: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
a970: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
a980: 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65  CS15:.....curr_e
a990: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
a9a0: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
a9b0: 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ty));......curr_
a9c0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
a9d0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
a9e0: 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d  ty->value_byte =
a9f0: 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75   vval[0];.....cu
aa00: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
aa10: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
aa20: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c  eak;...}....vval
aa30: 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c   += length;...vl
aa40: 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09  en -= length;...
aa50: 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79  .if (curr_entity
aa60: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
aa70: 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (root == NULL)
aa80: 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75   {.....root = cu
aa90: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
aaa0: 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20  ....if (last != 
aab0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74  NULL) {.....last
aac0: 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65  ->_next = curr_e
aad0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
aae0: 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  last = curr_enti
aaf0: 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ty;...}..}...ret
ab00: 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a  urn(root);.}../*
ab10: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
ab20: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
ab30: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
ab40: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
ab50: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
ab60: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
ab70: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
ab80: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
ab90: 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72  y_free_certs(str
aba0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
abb0: 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c  identity *start,
abc0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69   size_t count, i
abd0: 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b  nt free_start) {
abe0: 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09  ..size_t idx;...
abf0: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
ac00: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  x < count; idx++
ac10: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b  ) {...if (start[
ac20: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
ac30: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72  ) {....free(star
ac40: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
ac50: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  te);...}..}...if
ac60: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a   (free_start) {.
ac70: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09  ..free(start);..
ac80: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
ac90: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
aca0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
acb0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
acc0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
acd0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
ace0: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
acf0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
ad00: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
ad10: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
ad20: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
ad30: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
ad40: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
ad50: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
ad60: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72  sc_identity *cer
ad70: 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ts, unsigned lon
ad80: 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72  g *count) {..str
ad90: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
ada0: 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
adb0: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
adc0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63  y_tlv_entity *cc
add0: 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72  c_tlv, *ccc_curr
ade0: 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70  , *app_tlv, *app
adf0: 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _curr;..unsigned
ae00: 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20   char ccc_aid[] 
ae10: 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43  = {GSCIS_AID_CCC
ae20: 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
ae30: 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09  r curr_aid[7];..
ae40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75  unsigned long ou
ae50: 74 69 64 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tidx = 0;..cacke
ae60: 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74 69 6f  y_ret transactio
ae70: 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 63 65 72 74  n_ret;..int cert
ae80: 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e  s_resizable;..in
ae90: 74 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65  t send_ret, sele
aea0: 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ct_ret;...CACKEY
aeb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
aec0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
aed0: 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  count == NULL) {
aee0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
aef0: 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73  PRINTF("count is
af00: 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67   NULL, returning
af10: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
af20: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
af30: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21  .}...if (certs !
af40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
af50: 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  *count == 0) {..
af60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
af70: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64  RINTF("Requested
af80: 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a   we return 0 obj
af90: 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63  ects, short-circ
afa0: 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  uit");.....retur
afb0: 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
afc0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
afd0: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
afe0: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
aff0: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
b000: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
b010: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
b020: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
b030: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
b040: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
b050: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
b060: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
b070: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
b080: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
b090: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
b0a0: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
b0b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
b0c0: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
b0d0: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
b0e0: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
b0f0: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
b100: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
b110: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
b120: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65   = 0;..}.../* Se
b130: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
b140: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
b150: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
b160: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
b170: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
b180: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
b190: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
b1a0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
b1b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b1c0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73  NTF("Unable to s
b1d0: 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74  elect CCC Applet
b1e0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
b1f0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20  ailure");..../* 
b200: 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
b210: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b220: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
b230: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b240: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
b250: 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64  L);..}.../* Read
b260: 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
b270: 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
b280: 54 4c 56 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20  TLV */..ccc_tlv 
b290: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c  = cackey_read_tl
b2a0: 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f  v(slot);.../* Lo
b2b0: 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20  ok for CARDURLs 
b2c0: 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20  that coorespond 
b2d0: 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a  to PKI applets *
b2e0: 2f 0a 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72  /..for (ccc_curr
b2f0: 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f   = ccc_tlv; ccc_
b300: 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d  curr; ccc_curr =
b310: 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   ccc_curr->_next
b320: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
b330: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
b340: 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20   tag: %s ... ", 
b350: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
b360: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63  C_TAG_TO_STR(ccc
b370: 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09  _curr->tag));...
b380: 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74  .if (ccc_curr->t
b390: 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
b3a0: 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 43 41  CARDURL) {....CA
b3b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b3c0: 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
b3d0: 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
b3e0: 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c  re about CARDURL
b3f0: 73 29 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  s)");.....contin
b400: 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ue;...}....if ((
b410: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
b420: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
b430: 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
b440: 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
b450: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
b460: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b470: 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
b480: 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
b490: 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b  ly care about PK
b4a0: 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20  I applets, this 
b4b0: 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a  applet supports:
b4c0: 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b   %s/%02x)", CACK
b4d0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
b4e0: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63  PTYPE_TO_STR(ccc
b4f0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b500: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20  durl->apptype), 
b510: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63  (unsigned int) c
b520: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
b530: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
b540: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
b550: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
b560: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
b570: 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
b580: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
b590: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
b5a0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b5b0: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 43 41 43 4b  l->rid));...CACK
b5c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b5d0: 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c  "AppID = %s/%04l
b5e0: 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
b5f0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
b600: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
b610: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
b620: 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
b630: 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
b640: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
b650: 69 64 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  id);...CACKEY_DE
b660: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65  BUG_PRINTF("Obje
b670: 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ctID = %s/%04lx"
b680: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
b690: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
b6a0: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
b6b0: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
b6c0: 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
b6d0: 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
b6e0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
b6f0: 6a 65 63 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63  jectid);....memc
b700: 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
b710: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b720: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
b730: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
b740: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
b750: 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ;...curr_aid[siz
b760: 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
b770: 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e  2] = (ccc_curr->
b780: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
b790: 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66  ppid >> 8) & 0xf
b7a0: 66 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69  f;...curr_aid[si
b7b0: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
b7c0: 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e   1] = ccc_curr->
b7d0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
b7e0: 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09  ppid & 0xff;....
b7f0: 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20  /* Select found 
b800: 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09  applet ... */...
b810: 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63  select_ret = cac
b820: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
b830: 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64  t(slot, curr_aid
b840: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  , sizeof(curr_ai
b850: 64 29 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63  d));...if (selec
b860: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
b870: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
b880: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b890: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
b8a0: 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b  elect applet, sk
b8b0: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
b8c0: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
b8d0: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
b8e0: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20  ;...}..../* ... 
b8f0: 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
b900: 29 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65  ) */...select_re
b910: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
b920: 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63  t_file(slot, ccc
b930: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b940: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
b950: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
b960: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
b970: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
b980: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b990: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
b9a0: 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67  t file, skipping
b9b0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
b9c0: 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  his object");...
b9d0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
b9e0: 0a 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .../* Process th
b9f0: 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f  is file's TLV lo
ba00: 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66  oking for certif
ba10: 69 63 61 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f  icates */...app_
ba20: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
ba30: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
ba40: 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20  for (app_curr = 
ba50: 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72  app_tlv; app_cur
ba60: 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70  r; app_curr = ap
ba70: 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  p_curr->_next) {
ba80: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ba90: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
baa0: 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ag: %s", CACKEY_
bab0: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
bac0: 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e  O_STR(app_curr->
bad0: 74 61 67 29 29 3b 0a 09 09 09 69 66 20 28 61 70  tag));....if (ap
bae0: 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47  p_curr->tag != G
baf0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
bb00: 43 41 54 45 29 20 7b 0a 09 09 09 09 43 41 43 4b  CATE) {.....CACK
bb10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bb20: 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
bb30: 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
bb40: 20 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41   about CERTIFICA
bb50: 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e  TEs)");......con
bb60: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
bb70: 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
bb80: 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74  [outidx];....out
bb90: 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70  idx++;.....memcp
bba0: 79 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  y(curr_id->apple
bbb0: 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
bbc0: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
bbd0: 6c 65 74 29 29 3b 0a 09 09 09 63 75 72 72 5f 69  let));....curr_i
bbe0: 64 2d 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75  d->file = ccc_cu
bbf0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
bc00: 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09  l->objectid;....
bc10: 63 75 72 72 5f 69 64 2d 3e 6c 61 62 65 6c 20 3d  curr_id->label =
bc20: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 43 41 43 4b 45   NULL;.....CACKE
bc30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bc40: 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d  Filling curr_id-
bc50: 3e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74  >applet (%p) wit
bc60: 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63  h %lu bytes:", c
bc70: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
bc80: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
bc90: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
bca0: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 43 41 43  applet));....CAC
bcb0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
bcc0: 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f  UF("VAL:", curr_
bcd0: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65  id->applet, size
bce0: 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  of(curr_id->appl
bcf0: 65 74 29 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  et));.....curr_i
bd00: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
bd10: 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c  en = app_curr->l
bd20: 65 6e 67 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f  ength;.....curr_
bd30: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
bd40: 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
bd50: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
bd60: 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75  n);....memcpy(cu
bd70: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
bd80: 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61  te, app_curr->va
bd90: 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  lue, curr_id->ce
bda0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
bdb0: 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e  ....if (outidx >
bdc0: 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  = *count) {.....
bdd0: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
bde0: 62 6c 65 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75  ble) {......*cou
bdf0: 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65  nt *= 2;......ce
be00: 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65  rts = realloc(ce
be10: 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72  rts, sizeof(*cer
be20: 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b  ts) * (*count));
be30: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
be40: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
be50: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ...}...}....cack
be60: 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f  ey_free_tlv(app_
be70: 74 6c 76 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74  tlv);....if (out
be80: 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
be90: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
bea0: 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  }...cackey_free_
beb0: 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09  tlv(ccc_tlv);...
bec0: 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b  *count = outidx;
bed0: 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
bee0: 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74  izable) {...cert
bef0: 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74  s = realloc(cert
bf00: 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  s, sizeof(*certs
bf10: 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09  ) * (*count));..
bf20: 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  }.../* Terminate
bf30: 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
bf40: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
bf50: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
bf60: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72  n(slot);...retur
bf70: 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a  n(certs);.}../*.
bf80: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
bf90: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
bfa0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
bfb0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
bfc0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
bfd0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
bfe0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
bff0: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
c000: 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
c010: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c020: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
c030: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
c040: 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
c050: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
c060: 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75  size_t buflen, u
c070: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
c080: 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74  tbuf, size_t out
c090: 62 75 66 6c 65 6e 29 20 7b 0a 09 63 61 63 6b 65  buflen) {..cacke
c0a0: 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a  y_ret send_ret;.
c0b0: 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45  .int le;...CACKE
c0c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c0d0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
c0e0: 28 62 75 66 6c 65 6e 20 3e 20 32 35 35 29 20 7b  (buflen > 255) {
c0f0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c100: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
c110: 62 75 66 6c 65 6e 20 69 73 20 67 72 65 61 74 65  buflen is greate
c120: 72 20 74 68 61 6e 20 32 35 35 20 28 62 75 66 6c  r than 255 (bufl
c130: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73  en = %lu)", (uns
c140: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c  igned long) bufl
c150: 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  en);....return(-
c160: 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74  1);..}...if (out
c170: 62 75 66 6c 65 6e 20 3e 20 32 35 33 29 20 7b 0a  buflen > 253) {.
c180: 09 09 6c 65 20 3d 20 32 35 33 3b 0a 09 7d 20 65  ..le = 253;..} e
c190: 6c 73 65 20 7b 0a 09 09 6c 65 20 3d 20 6f 75 74  lse {...le = out
c1a0: 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20  buflen;..}...if 
c1b0: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
c1c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c1d0: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
c1e0: 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  slot is NULL");.
c1f0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c200: 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e  }...if (buf == N
c210: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
c220: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
c230: 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c  ror.  buf is NUL
c240: 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
c250: 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74  1);..}...if (out
c260: 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  buf == NULL) {..
c270: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c280: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75  INTF("Error.  ou
c290: 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tbuf is NULL");.
c2a0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c2b0: 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  }...if (identity
c2c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
c2d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c2e0: 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74  F("Error.  ident
c2f0: 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  ity is NULL");..
c300: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
c310: 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
c320: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  >pcsc_identity =
c330: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
c340: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c350: 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74  "Error.  identit
c360: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
c370: 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
c380: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
c390: 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63  /* Begin transac
c3a0: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
c3b0: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
c3c0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65  n(slot);.../* Se
c3d0: 6c 65 63 74 20 63 6f 72 72 65 63 74 20 61 70 70  lect correct app
c3e0: 6c 65 74 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44  let */..CACKEY_D
c3f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c  EBUG_PRINTF("Sel
c400: 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f  ecting applet fo
c410: 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20  und at %p ...", 
c420: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
c430: 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 29  dentity->applet)
c440: 3b 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  ;..cackey_select
c450: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64  _applet(slot, id
c460: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
c470: 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 2c 20 73  ntity->applet, s
c480: 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e  izeof(identity->
c490: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61  pcsc_identity->a
c4a0: 70 70 6c 65 74 29 29 3b 0a 0a 09 2f 2a 20 53 65  pplet));.../* Se
c4b0: 6c 65 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c  lect correct fil
c4c0: 65 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 73 65 6c  e */..cackey_sel
c4d0: 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69  ect_file(slot, i
c4e0: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
c4f0: 65 6e 74 69 74 79 2d 3e 66 69 6c 65 29 3b 0a 0a  entity->file);..
c500: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
c510: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
c520: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
c530: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
c540: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e  GSCIS_INSTR_SIGN
c550: 44 45 43 52 59 50 54 2c 20 30 78 30 30 2c 20 30  DECRYPT, 0x00, 0
c560: 78 30 30 2c 20 62 75 66 6c 65 6e 2c 20 62 75 66  x00, buflen, buf
c570: 2c 20 6c 65 2c 20 4e 55 4c 4c 2c 20 6f 75 74 62  , le, NULL, outb
c580: 75 66 2c 20 26 6f 75 74 62 75 66 6c 65 6e 29 3b  uf, &outbuflen);
c590: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
c5a0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
c5b0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
c5c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
c5d0: 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64  U Sending Failed
c5e0: 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e   -- returning in
c5f0: 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 2f 2a   error.");..../*
c600: 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   End transaction
c610: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
c620: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
c630: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
c640: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 74  );..}.../* End t
c650: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
c660: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
c670: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69  ction(slot);..#i
c680: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
c690: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
c6a0: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
c6b0: 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20  if (outbuflen > 
c6c0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
c6d0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c6e0: 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62 75  UG_PRINTF("Outbu
c6f0: 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61 78  flen exceeds max
c700: 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
c710: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
c720: 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 75  . (max = %li, ou
c730: 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c  tbuflen = %lu)",
c740: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
c750: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
c760: 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66  ned long) outbuf
c770: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
c780: 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66  -1);..}.#  endif
c790: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
c7a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
c7b0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
c7c0: 65 73 73 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e  ess.");...return
c7d0: 28 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 7d 0a 0a  (outbuflen);.}..
c7e0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
c7f0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
c800: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
c810: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
c820: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
c830: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
c840: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
c850: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
c860: 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  et cackey_login(
c870: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c880: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
c890: 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e  ed char *pin, un
c8a0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f  signed long pin_
c8b0: 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f  len, int *tries_
c8c0: 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
c8d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61  unsigned char ca
c8e0: 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46  c_pin[8] = {0xFF
c8f0: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
c900: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
c910: 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69  0xFF, 0xFF};..ui
c920: 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f  nt16_t response_
c930: 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73  code;..int tries
c940: 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74  _remaining;..int
c950: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20   send_ret;.../* 
c960: 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65  Indicate that we
c970: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f   do not know abo
c980: 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65  ut how many trie
c990: 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20  s are remaining 
c9a0: 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65  */..if (tries_re
c9b0: 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a  maining_p) {...*
c9c0: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
c9d0: 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20  p = -1;..}.../* 
c9e0: 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20  Apparently, CAC 
c9f0: 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c  PINs are *EXACTL
ca00: 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20  Y* 8 bytes long 
ca10: 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46  -- pad with 0xFF
ca20: 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f   if too short */
ca30: 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d  ..if (pin_len >=
ca40: 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63   8) {...memcpy(c
ca50: 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b  ac_pin, pin, 8);
ca60: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d  ..} else {...mem
ca70: 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e  cpy(cac_pin, pin
ca80: 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a  , pin_len);..}..
ca90: 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65  ./* Issue PIN Ve
caa0: 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  rify */..send_re
cab0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
cac0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
cad0: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
cae0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49  GSCIS_INSTR_VERI
caf0: 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  FY, 0x00, 0x00, 
cb00: 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c  sizeof(cac_pin),
cb10: 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20   cac_pin, 0x00, 
cb20: 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20  &response_code, 
cb30: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
cb40: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
cb50: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
cb60: 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73  {...if ((respons
cb70: 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29  e_code & 0x63C0)
cb80: 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09   == 0x63C0) {...
cb90: 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  .tries_remaining
cba0: 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64   = (response_cod
cbb0: 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41  e & 0xF);.....CA
cbc0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cbd0: 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
cbe0: 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74  ion failed, %i t
cbf0: 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c  ries remaining",
cc00: 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
cc10: 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  );.....if (tries
cc20: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
cc30: 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69  ....*tries_remai
cc40: 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72  ning_p = tries_r
cc50: 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a  emaining;....}..
cc60: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
cc70: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
cc80: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70  ...}....if (resp
cc90: 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36  onse_code == 0x6
cca0: 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  983) {....CACKEY
ccb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
ccc0: 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
ccd0: 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69  failed, device i
cce0: 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09  s locked");.....
ccf0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
cd00: 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  SC_E_LOCKED);...
cd10: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  }....return(CACK
cd20: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
cd30: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
cd40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
cd50: 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73  N Verification s
cd60: 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65  ucceeded");...re
cd70: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
cd80: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
cd90: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
cda0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
cdb0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
cdc0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
cdd0: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
cde0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
cdf0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
ce00: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
ce10: 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
ce20: 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  nt(struct cackey
ce30: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
ce40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 63  unsigned char cc
ce50: 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53  c_aid[] = {GSCIS
ce60: 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 69 6e 74 20  _AID_CCC};..int 
ce70: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 53  send_ret;.../* S
ce80: 65 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70  elect the CCC Ap
ce90: 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  plet */..send_re
cea0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
ceb0: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
cec0: 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  cc_aid, sizeof(c
ced0: 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73  cc_aid));..if (s
cee0: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
cef0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
cf00: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
cf10: 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_S_TOKENABSEN
cf20: 54 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  T);..}...return(
cf30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
cf40: 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a  KENPRESENT);.}..
cf50: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
cf60: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
cf70: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
cf80: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
cf90: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
cfa0: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
cfb0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
cfc0: 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
cfd0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
cfe0: 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74  tity_to_label(st
cff0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
d000: 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
d010: 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ity, unsigned ch
d020: 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75  ar *label_buf, u
d030: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62  nsigned long lab
d040: 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75  el_buf_len) {..u
d050: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72  nsigned long cer
d060: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 63  tificate_len;..c
d070: 68 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b  har *label_asn1;
d080: 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63  ..void *certific
d090: 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72  ate;..int x509_r
d0a0: 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69  ead_ret;...certi
d0b0: 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
d0c0: 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
d0d0: 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
d0e0: 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
d0f0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
d100: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
d110: 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  len < 0) {...ret
d120: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35  urn(-1);..}...x5
d130: 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
d140: 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
d150: 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
d160: 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69  ficate_len, (voi
d170: 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e  d **) &label_asn
d180: 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  1);..if (x509_re
d190: 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
d1a0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
d1b0: 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
d1c0: 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
d1d0: 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
d1e0: 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
d1f0: 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
d200: 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
d210: 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30   "CN");..if (x50
d220: 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29  9_read_ret <= 0)
d230: 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72   {...x509_read_r
d240: 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f  et = x509_dn_to_
d250: 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e  string(label_asn
d260: 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
d270: 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c  , (char *) label
d280: 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f  _buf, label_buf_
d290: 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69  len, NULL);....i
d2a0: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
d2b0: 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   <= 0) {....retu
d2c0: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
d2d0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
d2e0: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
d2f0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
d300: 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
d310: 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  ret > _POSIX_SSI
d320: 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
d330: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d340: 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65  "x509_read_ret e
d350: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
d360: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
d370: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
d380: 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61   = %li, x509_rea
d390: 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28  d_ret = %lu)", (
d3a0: 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49  long) _POSIX_SSI
d3b0: 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65  ZE_MAX, (unsigne
d3c0: 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61  d long) x509_rea
d3d0: 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  d_ret);....retur
d3e0: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
d3f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75  if.#endif...retu
d400: 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  rn(x509_read_ret
d410: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
d420: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
d430: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
d440: 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
d450: 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a  void **mutex) {.
d460: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
d470: 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
d480: 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
d490: 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
d4a0: 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
d4b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d4c0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
d4d0: 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
d4e0: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
d4f0: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
d500: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
d510: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
d520: 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  tex = malloc(siz
d530: 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74  eof(*pthread_mut
d540: 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68  ex));...if (!pth
d550: 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09  read_mutex) {...
d560: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d570: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
d580: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e  allocate memory.
d590: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
d5a0: 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65  1);...}....pthre
d5b0: 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
d5c0: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70  ead_mutex_init(p
d5d0: 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55  thread_mutex, NU
d5e0: 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  LL);...if (pthre
d5f0: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
d600: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
d610: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
d620: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72  d_mutex_init() r
d630: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
d640: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
d650: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
d660: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d  n(-1);...}....*m
d670: 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d  utex = pthread_m
d680: 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  utex;..} else {.
d690: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67  ..if (cackey_arg
d6a0: 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b  s.CreateMutex) {
d6b0: 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61  ....custom_retva
d6c0: 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e  l = cackey_args.
d6d0: 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65  CreateMutex(mute
d6e0: 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
d6f0: 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
d700: 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
d710: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d720: 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
d730: 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  teMutex() return
d740: 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
d750: 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
d760: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
d770: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
d780: 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
d790: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
d7a0: 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
d7b0: 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
d7c0: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  rn(0);.}../* Ret
d7d0: 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
d7e0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
d7f0: 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
d800: 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b  k(void *mutex) {
d810: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
d820: 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
d830: 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
d840: 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
d850: 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
d860: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d870: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
d880: 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
d890: 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
d8a0: 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
d8b0: 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
d8c0: 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
d8d0: 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09  utex = mutex;...
d8e0: 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
d8f0: 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
d900: 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74  lock(pthread_mut
d910: 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  ex);...if (pthre
d920: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
d930: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
d940: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
d950: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72  d_mutex_lock() r
d960: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
d970: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
d980: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
d990: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n(-1);...}..} el
d9a0: 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
d9b0: 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
d9c0: 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
d9d0: 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
d9e0: 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74  gs.LockMutex(mut
d9f0: 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
da00: 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
da10: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
da20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
da30: 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  "cackey_args.Loc
da40: 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  kMutex() returne
da50: 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
da60: 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
da70: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
da80: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
da90: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
daa0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
dab0: 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
dac0: 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
dad0: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  n(0);.}../* Retu
dae0: 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
daf0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
db00: 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
db10: 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20  ck(void *mutex) 
db20: 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
db30: 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
db40: 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
db50: 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
db60: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
db70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
db80: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
db90: 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
dba0: 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
dbb0: 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
dbc0: 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
dbd0: 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
dbe0: 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a  mutex = mutex;..
dbf0: 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
dc00: 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
dc10: 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  _unlock(pthread_
dc20: 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
dc30: 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
dc40: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
dc50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
dc60: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
dc70: 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  k() returned err
dc80: 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
dc90: 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
dca0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
dcb0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
dcc0: 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
dcd0: 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  ckMutex) {....cu
dce0: 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
dcf0: 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
dd00: 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
dd10: 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
dd20: 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
dd30: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
dd40: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
dd50: 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
dd60: 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
dd70: 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
dd80: 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
dd90: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
dda0: 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
ddb0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ddc0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
ddd0: 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
dde0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
ddf0: 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54  .}..static CK_AT
de00: 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b  TRIBUTE_PTR cack
de10: 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
de20: 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  s(CK_OBJECT_CLAS
de30: 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73  S objectclass, s
de40: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
de50: 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
de60: 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c  tity, unsigned l
de70: 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ong identity_num
de80: 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
de90: 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74  ulCount) {..stat
dea0: 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74  ic CK_BBOOL ck_t
deb0: 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63  rue = 1;..static
dec0: 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c   CK_BBOOL ck_fal
ded0: 73 65 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e  se = 0;..CK_ULON
dee0: 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20  G numattrs = 0, 
def0: 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43  retval_count;..C
df00: 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  K_ATTRIBUTE_TYPE
df10: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
df20: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63  ..CK_ATTRIBUTE c
df30: 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61  urr_attr, *retva
df40: 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  l;..CK_VOID_PTR 
df50: 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
df60: 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43  G ulValueLen;..C
df70: 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63  K_OBJECT_CLASS c
df80: 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
df90: 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  .CK_CERTIFICATE_
dfa0: 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63  TYPE ck_certific
dfb0: 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45  ate_type;..CK_KE
dfc0: 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79  Y_TYPE ck_key_ty
dfd0: 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52  pe;..CK_UTF8CHAR
dfe0: 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b   ucTmpBuf[1024];
dff0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
e000: 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73  *certificate;..s
e010: 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61  size_t certifica
e020: 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30  te_len = -1, x50
e030: 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74  9_read_ret;..int
e040: 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09   pValue_free;...
e050: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e060: 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a  NTF("Called (obj
e070: 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20  ectClass = %lu, 
e080: 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25  identity_num = %
e090: 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
e0a0: 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61   long) objectcla
e0b0: 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ss, identity_num
e0c0: 29 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63  );...if (objectc
e0d0: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
e0e0: 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
e0f0: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55  tclass != CKO_PU
e100: 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65  BLIC_KEY && obje
e110: 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
e120: 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
e130: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e140: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
e150: 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
e160: 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20   invalid object 
e170: 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75  class");....retu
e180: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
e190: 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69  * Get Cert */..i
e1a0: 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
e1b0: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
e1c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e1d0: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
e1e0: 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69  s (NULL), invali
e1f0: 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64  d identiy provid
e200: 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ed");....return(
e210: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74  NULL);..}...cert
e220: 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69  ificate = identi
e230: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b  ty->certificate;
e240: 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ..certificate_le
e250: 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  n = identity->ce
e260: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
e270: 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
e280: 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65  _len == -1 || ce
e290: 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c  rtificate == NUL
e2a0: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
e2b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
e2c0: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
e2d0: 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65  (NULL), this ide
e2e0: 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68  ntity does not h
e2f0: 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72  ave an X.509 cer
e300: 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61  tificate associa
e310: 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20  ted with it and 
e320: 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b  will not work");
e330: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
e340: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
e350: 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74   that certificat
e360: 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64  e is ASN.1 encod
e370: 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  ed X.509 certifi
e380: 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30  cate */..if (x50
e390: 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74  9_to_serial(cert
e3a0: 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
e3b0: 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20  cate_len, NULL) 
e3c0: 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 0) {...CACKEY_
e3d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e3e0: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
e3f0: 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e  s (NULL), the X.
e400: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
e410: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
e420: 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73  this identity is
e430: 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09   not valid");...
e440: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
e450: 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74  }...retval_count
e460: 20 3d 20 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d   = 16;..retval =
e470: 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63   malloc(retval_c
e480: 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72  ount * sizeof(*r
e490: 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28  etval));...for (
e4a0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
e4b0: 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79   0; curr_attr_ty
e4c0: 70 65 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b  pe < 0xce53635f;
e4d0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b   curr_attr_type+
e4e0: 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f  +) {...if (curr_
e4f0: 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38  attr_type == 0x8
e500: 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74  00) {....curr_at
e510: 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33  tr_type = 0xce53
e520: 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61  6300;...}....pVa
e530: 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09  lue_free = 0;...
e540: 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
e550: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
e560: 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73  K_LONG) -1;....s
e570: 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72  witch (curr_attr
e580: 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  _type) {....case
e590: 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09   CKA_CLASS:.....
e5a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e5b0: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
e5c0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c  attribute CKA_CL
e5d0: 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASS (0x%08lx) ..
e5e0: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
e5f0: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
e600: 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a  pe);......ck_obj
e610: 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65  ect_class = obje
e620: 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56  ctclass;......pV
e630: 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63  alue = &ck_objec
e640: 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56  t_class;.....ulV
e650: 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
e660: 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  (ck_object_class
e670: 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
e680: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
e690: 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
e6a0: 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
e6b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
e6c0: 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29  _OBJECT_CLASS *)
e6d0: 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
e6e0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e6f0: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
e700: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
e710: 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09  se CKA_TOKEN:...
e720: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e730: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
e740: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
e750: 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20  TOKEN (0x%08lx) 
e760: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
e770: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
e780: 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
e790: 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
e7a0: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
e7b0: 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
e7c0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
e7d0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
e7e0: 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
e7f0: 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
e800: 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
e810: 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
e820: 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
e830: 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
e840: 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
e850: 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
e860: 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41  DIFIABLE:.....CA
e870: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e880: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
e890: 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49  tribute CKA_MODI
e8a0: 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29  FIABLE (0x%08lx)
e8b0: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
e8c0: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
e8d0: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
e8e0: 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
e8f0: 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
e900: 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
e910: 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
e920: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
e930: 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
e940: 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
e950: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
e960: 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
e970: 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
e980: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
e990: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
e9a0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
e9b0: 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b  _LABEL:.....CACK
e9c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e9d0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
e9e0: 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20  ibute CKA_LABEL 
e9f0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
ea00: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ea10: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
ea20: 0a 0a 09 09 09 09 2f 2a 20 44 65 74 65 72 6d 69  ....../* Determi
ea30: 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 78  ne name */.....x
ea40: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 63  509_read_ret = c
ea50: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
ea60: 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 69 64 65  ity_to_label(ide
ea70: 6e 74 69 74 79 2c 20 75 63 54 6d 70 42 75 66 2c  ntity, ucTmpBuf,
ea80: 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66   sizeof(ucTmpBuf
ea90: 29 29 3b 0a 09 09 09 09 69 66 20 28 78 35 30 39  ));.....if (x509
eaa0: 5f 72 65 61 64 5f 72 65 74 20 3e 20 30 29 20 7b  _read_ret > 0) {
eab0: 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75  ......pValue = u
eac0: 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 09 75 6c  cTmpBuf;......ul
ead0: 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
eae0: 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 7d 0a  read_ret;.....}.
eaf0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
eb00: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
eb10: 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
eb20: 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
eb30: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
eb40: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
eb50: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
eb60: 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b  _VALUE:.....CACK
eb70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
eb80: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
eb90: 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20  ibute CKA_VALUE 
eba0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
ebb0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ebc0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
ebd0: 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62  ......switch (ob
ebe0: 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09  jectclass) {....
ebf0: 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41  ..case CKO_PRIVA
ec00: 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41  TE_KEY:.......CA
ec10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ec20: 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
ec30: 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
ec40: 73 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76  se we are a priv
ec50: 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09  ate key.");.....
ec60: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
ec70: 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b  ase CKO_PUBLIC_K
ec80: 45 59 3a 0a 09 09 09 09 09 09 2f 2a 20 58 58 58  EY:......./* XXX
ec90: 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09 09 09  : TODO */.......
eca0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
ecb0: 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  e CKO_CERTIFICAT
ecc0: 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20  E:.......pValue 
ecd0: 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  = certificate;..
ece0: 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
ecf0: 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  = certificate_le
ed00: 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  n;........break;
ed10: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
ed20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ed30: 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
ed40: 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
ed50: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ed60: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
ed70: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
ed80: 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09  e CKA_ISSUER:...
ed90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
eda0: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
edb0: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
edc0: 49 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29  ISSUER (0x%08lx)
edd0: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
ede0: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
edf0: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
ee00: 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
ee10: 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
ee20: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
ee30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
ee40: 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
ee50: 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
ee60: 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
ee70: 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09  icate.");.......
ee80: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
ee90: 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
eea0: 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
eeb0: 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
eec0: 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65   = x509_to_issue
eed0: 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  r(certificate, c
eee0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
eef0: 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
ef00: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
ef10: 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
ef20: 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
ef30: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
ef40: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
ef50: 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
ef60: 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
ef70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ef80: 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
ef90: 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
efa0: 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
efb0: 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
efc0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
efd0: 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  case CKA_SERIAL_
efe0: 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b  NUMBER:.....CACK
eff0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f000: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
f010: 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c  ibute CKA_SERIAL
f020: 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78  _NUMBER (0x%08lx
f030: 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
f040: 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
f050: 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
f060: 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
f070: 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
f080: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
f090: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
f0a0: 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
f0b0: 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
f0c0: 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
f0d0: 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09  ficate.");......
f0e0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
f0f0: 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
f100: 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
f110: 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
f120: 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69  t = x509_to_seri
f130: 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
f140: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
f150: 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
f160: 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
f170: 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
f180: 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
f190: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
f1a0: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
f1b0: 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
f1c0: 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
f1d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f1e0: 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
f1f0: 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
f200: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
f210: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
f220: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
f230: 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a  ...case CKA_SUBJ
f240: 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ECT:.....CACKEY_
f250: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f260: 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
f270: 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28  te CKA_SUBJECT (
f280: 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
f290: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
f2a0: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
f2b0: 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
f2c0: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
f2d0: 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09  IFICATE) {......
f2e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f2f0: 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
f300: 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
f310: 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
f320: 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29  a certificate.")
f330: 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
f340: 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
f350: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
f360: 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
f370: 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
f380: 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69  to_subject(certi
f390: 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
f3a0: 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
f3b0: 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
f3c0: 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
f3d0: 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
f3e0: 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
f3f0: 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
f400: 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
f410: 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
f420: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
f430: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
f440: 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
f450: 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
f460: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
f470: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
f480: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
f490: 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59  A_ID:.....CACKEY
f4a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
f4b0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
f4c0: 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30  ute CKA_ID (0x%0
f4d0: 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
f4e0: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
f4f0: 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
f500: 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28  .ucTmpBuf[0] = (
f510: 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20  (identity_num + 
f520: 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  1) >> 8) & 0xff;
f530: 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d  .....ucTmpBuf[1]
f540: 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75   =  (identity_nu
f550: 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a  m + 1) & 0xff;..
f560: 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63  ....pValue = &uc
f570: 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61  TmpBuf;.....ulVa
f580: 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09  lueLen = 2;.....
f590: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f5a0: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
f5b0: 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
f5c0: 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
f5d0: 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
f5e0: 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
f5f0: 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49  ..case CKA_CERTI
f600: 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09  FICATE_TYPE:....
f610: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f620: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
f630: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
f640: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
f650: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
f660: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f670: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
f680: 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
f690: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
f6a0: 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
f6b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f6c0: 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
f6d0: 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
f6e0: 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
f6f0: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22   a certificate."
f700: 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
f710: 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
f720: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e   only support on
f730: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 79  e certificate ty
f740: 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72  pe */.....ck_cer
f750: 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20  tificate_type = 
f760: 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09  CKC_X_509;......
f770: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72  pValue = &ck_cer
f780: 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09  tificate_type;..
f790: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
f7a0: 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66  sizeof(ck_certif
f7b0: 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09  icate_type);....
f7c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f7d0: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
f7e0: 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20  rning CKC_X_509 
f7f0: 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c  (%lu) (%p/%lu)",
f800: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
f810: 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41   *((CK_CERTIFICA
f820: 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75  TE_TYPE *) pValu
f830: 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
f840: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
f850: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
f860: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
f870: 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43  _KEY_TYPE:.....C
f880: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f890: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
f8a0: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59  ttribute CKA_KEY
f8b0: 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20  _TYPE (0x%08lx) 
f8c0: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
f8d0: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
f8e0: 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
f8f0: 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
f900: 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26  KO_PRIVATE_KEY &
f910: 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
f920: 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29   CKO_PUBLIC_KEY)
f930: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
f940: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
f950: 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
f960: 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
f970: 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29  are not a key.")
f980: 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
f990: 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20  ...}....../* We 
f9a0: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65  only support one
f9b0: 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09   key type */....
f9c0: 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43  .ck_key_type = C
f9d0: 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61  KK_RSA;......pVa
f9e0: 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79  lue = &ck_key_ty
f9f0: 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  pe;.....ulValueL
fa00: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b  en = sizeof(ck_k
fa10: 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43  ey_type);......C
fa20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
fa30: 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
fa40: 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29  ng CKK_RSA (%lu)
fa50: 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
fa60: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
fa70: 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
fa80: 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  PE *) pValue), p
fa90: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
faa0: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
fab0: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
fac0: 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
fad0: 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
fae0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
faf0: 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
fb00: 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c  CKA_SIGN (0x%08l
fb10: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
fb20: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
fb30: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
fb40: 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
fb50: 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
fb60: 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
fb70: 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
fb80: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
fb90: 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
fba0: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
fbb0: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
fbc0: 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
fbd0: 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
fbe0: 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
fbf0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
fc00: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
fc10: 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
fc20: 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
fc30: 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
fc40: 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
fc50: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
fc60: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
fc70: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
fc80: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43  ....case CKA_DEC
fc90: 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  RYPT:.....CACKEY
fca0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
fcb0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
fcc0: 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20  ute CKA_DECRYPT 
fcd0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
fce0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
fcf0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
fd00: 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
fd10: 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
fd20: 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65  VATE_KEY || obje
fd30: 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
fd40: 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09  UBLIC_KEY) {....
fd50: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
fd60: 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
fd70: 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
fd80: 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
fd90: 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
fda0: 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
fdb0: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
fdc0: 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
fdd0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
fde0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fdf0: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
fe00: 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
fe10: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
fe20: 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
fe30: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
fe40: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
fe50: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
fe60: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
fe70: 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45   CKA_TRUST_SERVE
fe80: 52 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b  R_AUTH:.....CACK
fe90: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fea0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
feb0: 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
fec0: 53 45 52 56 45 52 5f 41 55 54 48 20 28 30 78 25  SERVER_AUTH (0x%
fed0: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
fee0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
fef0: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
ff00: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
ff10: 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
ff20: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
ff30: 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
ff40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ff50: 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
ff60: 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
ff70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
ff80: 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
ff90: 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
ffa0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
ffb0: 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
ffc0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
ffd0: 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54  CKA_TRUST_CLIENT
ffe0: 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b 45  _AUTH:.....CACKE
fff0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10000 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
10010 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  bute CKA_TRUST_C
10020 4c 49 45 4e 54 5f 41 55 54 48 20 28 30 78 25 30  LIENT_AUTH (0x%0
10030 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
10040 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
10050 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
10060 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
10070 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
10080 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
10090 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
100a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
100b0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
100c0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
100d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
100e0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
100f0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
10100 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
10110 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
10120 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
10130 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49  KA_TRUST_CODE_SI
10140 47 4e 49 4e 47 3a 0a 09 09 09 09 43 41 43 4b 45  GNING:.....CACKE
10150 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10160 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
10170 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  bute CKA_TRUST_C
10180 4f 44 45 5f 53 49 47 4e 49 4e 47 20 28 30 78 25  ODE_SIGNING (0x%
10190 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
101a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
101b0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
101c0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
101d0 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
101e0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
101f0 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
10200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10210 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
10220 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
10230 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
10240 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
10250 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
10260 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
10270 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
10280 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
10290 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f  CKA_TRUST_EMAIL_
102a0 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09  PROTECTION:.....
102b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
102c0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
102d0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
102e0 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43  UST_EMAIL_PROTEC
102f0 54 49 4f 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  TION (0x%08lx) .
10300 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
10310 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
10320 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
10330 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
10340 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
10350 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
10360 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10370 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
10380 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
10390 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
103a0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
103b0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
103c0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
103d0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
103e0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
103f0 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
10400 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
10410 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
10420 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09   (CK_LONG) -1;..
10430 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
10440 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20  .if (((CK_LONG) 
10450 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28  ulValueLen) != (
10460 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b  (CK_LONG) -1)) {
10470 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72  ..../* Push curr
10480 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73  _attr onto the s
10490 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f  tack */....curr_
104a0 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72  attr.type = curr
104b0 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63  _attr_type;....c
104c0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
104d0 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  Len = ulValueLen
104e0 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  ;.....curr_attr.
104f0 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
10500 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
10510 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79  eLen);....memcpy
10520 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  (curr_attr.pValu
10530 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  e, pValue, curr_
10540 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
10550 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65  ;.....if (pValue
10560 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29  _free && pValue)
10570 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c   {.....free(pVal
10580 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ue);....}.....if
10590 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65   (numattrs >= re
105a0 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  tval_count) {...
105b0 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  ..retval_count *
105c0 3d 20 32 3b 0a 09 09 09 09 72 65 74 76 61 6c 20  = 2;.....retval 
105d0 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c  = realloc(retval
105e0 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  , retval_count *
105f0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
10600 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
10610 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74  py(&retval[numat
10620 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72  trs], &curr_attr
10630 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74  , sizeof(curr_at
10640 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72  tr));....numattr
10650 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  s++;...}..}...if
10660 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29   (numattrs != 0)
10670 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e   {...retval_coun
10680 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09  t = numattrs;...
10690 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63  retval = realloc
106a0 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f  (retval, retval_
106b0 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
106c0 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73  retval));..} els
106d0 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61  e {...free(retva
106e0 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20  l);....retval = 
106f0 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43  NULL;..}...*pulC
10700 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
10710 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10720 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
10730 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25  g %lu objects (%
10740 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20  p).", numattrs, 
10750 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
10760 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
10770 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
10780 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
10790 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  (struct cackey_i
107a0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
107b0 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ies, unsigned lo
107c0 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  ng identities_co
107d0 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49  unt) {..CK_ATTRI
107e0 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
107f0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
10800 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78  id_idx, attr_idx
10810 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69  ;...if (identiti
10820 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64  es == NULL || id
10830 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
10840 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  = 0) {...return;
10850 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64  ..}...for (id_id
10860 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20  x = 0; id_idx < 
10870 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
10880 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  ; id_idx++) {...
10890 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69  if (identities[i
108a0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
108b0 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74  s) {....for (att
108c0 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f  r_idx = 0; attr_
108d0 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73  idx < identities
108e0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
108f0 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f  tes_count; attr_
10900 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72  idx++) {.....cur
10910 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69  r_attr = &identi
10920 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
10930 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78  ributes[attr_idx
10940 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72  ];......if (curr
10950 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b  _attr->pValue) {
10960 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f  ......free(curr_
10970 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09  attr->pValue);..
10980 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
10990 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
109a0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
109b0 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e   {.....free(iden
109c0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
109d0 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d  ttributes);....}
109e0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
109f0 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 69 65  _certs(identitie
10a00 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
10a10 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a  dentity, 1, 1);.
10a20 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64  ..}..}...free(id
10a30 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74  entities);.}..st
10a40 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
10a50 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  ey_identity *cac
10a60 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
10a70 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
10a80 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
10a90 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73  signed long *ids
10aa0 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63  _found) {..struc
10ab0 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
10ac0 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
10ad0 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74  ntities;..struct
10ae0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
10af0 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
10b00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
10b10 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75  _ids, id_idx, cu
10b20 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73  rr_id_type;..uns
10b30 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
10b40 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a  erts, cert_idx;.
10b50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10b60 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
10b70 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e  ;...if (ids_foun
10b80 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d == NULL) {...C
10b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10ba0 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f  TF("Error.  ids_
10bb0 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b  found is NULL");
10bc0 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
10bd0 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e  ;..}...pcsc_iden
10be0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
10bf0 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c  read_certs(slot,
10c00 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
10c10 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64  s);..if (pcsc_id
10c20 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
10c30 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74  ) {.../* Convert
10c40 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73   number of Certs
10c50 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62   to number of ob
10c60 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69  jects */...num_i
10c70 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54  ds = (CKO_PRIVAT
10c80 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54  E_KEY - CKO_CERT
10c90 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e  IFICATE + 1) * n
10ca0 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 64 65  um_certs;....ide
10cb0 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63  ntities = malloc
10cc0 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f  (num_ids * sizeo
10cd0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b  f(*identities));
10ce0 0a 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a  ....id_idx = 0;.
10cf0 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20  ..for (cert_idx 
10d00 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20  = 0; cert_idx < 
10d10 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f  num_certs; cert_
10d20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20  idx++) {....for 
10d30 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20  (curr_id_type = 
10d40 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b  CKO_CERTIFICATE;
10d50 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d   curr_id_type <=
10d60 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
10d70 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b  ; curr_id_type++
10d80 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69  ) {.....identiti
10d90 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
10da0 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
10db0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63 75  et_attributes(cu
10dc0 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73  rr_id_type, &pcs
10dd0 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
10de0 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78  t_idx], cert_idx
10df0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
10e00 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
10e10 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 66  _count);......if
10e20 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
10e30 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
10e40 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  == NULL) {......
10e50 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
10e60 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
10e70 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09 7d 0a 0a  unt = 0;.....}..
10e80 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
10e90 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
10ea0 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
10eb0 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
10ec0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
10ed0 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d 65  entity));.....me
10ee0 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
10ef0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
10f00 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64 65  ntity, &pcsc_ide
10f10 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
10f20 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74  ], sizeof(*ident
10f30 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
10f40 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a  sc_identity));..
10f50 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
10f60 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
10f70 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
10f80 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f  e = malloc(pcsc_
10f90 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
10fa0 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
10fb0 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
10fc0 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
10fd0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
10fe0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
10ff0 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
11000 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
11010 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
11020 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
11030 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
11040 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b  n);......id_idx+
11050 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  +;....}...}....c
11060 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
11070 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
11080 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
11090 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d  ....*ids_found =
110a0 20 6e 75 6d 5f 69 64 73 3b 0a 09 09 72 65 74 75   num_ids;...retu
110b0 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a  rn(identities);.
110c0 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20  .}...*ids_found 
110d0 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c  = 0;..return(NUL
110e0 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  L);.}..CK_DEFINE
110f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
11100 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43   C_Initialize)(C
11110 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74  K_VOID_PTR pInit
11120 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e  Args) {..CK_C_IN
11130 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b  ITIALIZE_ARGS CK
11140 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74  _PTR args;..uint
11150 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d  32_t idx;..int m
11160 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a  utex_init_ret;..
11170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11180 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
11190 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67 73  ...if (pInitArgs
111a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72   != NULL) {...ar
111b0 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a  gs = pInitArgs;.
111c0 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79  ..memcpy(&cackey
111d0 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a  _args, args, siz
111e0 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29  eof(cackey_args)
111f0 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e  );....if (args->
11200 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e  CreateMutex == N
11210 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73  ULL || args->Des
11220 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  troyMutex == NUL
11230 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d  L || args->LockM
11240 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
11250 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65  args->UnlockMute
11260 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  x == NULL) {....
11270 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65  if (args->Create
11280 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
11290 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75   args->DestroyMu
112a0 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
112b0 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21  rgs->LockMutex !
112c0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
112d0 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e  UnlockMutex != N
112e0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
112f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11300 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74  Error. Some, but
11310 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69   not All threadi
11320 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72  ng primitives pr
11330 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09  ovided.");......
11340 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
11350 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a  ENTS_BAD);....}.
11360 09 09 7d 0a 0a 09 09 69 66 20 28 61 72 67 73 2d  ..}....if (args-
11370 3e 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  >pReserved != NU
11380 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
11390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
113a0 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69  ror. pReserved i
113b0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
113c0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
113d0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
113e0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  }..} else {...ca
113f0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
11400 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
11410 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74  cackey_args.Dest
11420 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  royMutex = NULL;
11430 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  ...cackey_args.L
11440 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
11450 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  ...cackey_args.U
11460 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c  nlockMutex = NUL
11470 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
11480 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  .flags = 0;..}..
11490 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74  .if (cackey_init
114a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
114b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
114c0 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64  ("Error.  Alread
114d0 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  y initialized.")
114e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
114f0 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59  CRYPTOKI_ALREADY
11500 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
11510 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
11520 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
11530 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
11540 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
11550 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
11560 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
11570 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
11580 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
11590 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
115a0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
115b0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
115c0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
115d0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
115e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
115f0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
11600 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
11610 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  dx].pcsc_reader 
11620 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
11630 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
11640 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
11650 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
11660 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
11670 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b  t = 0;..}...cack
11680 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
11690 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65   1;...if (!cacke
116a0 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20  y_biglock_init) 
116b0 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72  {...mutex_init_r
116c0 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  et = cackey_mute
116d0 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79  x_create(&cackey
116e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
116f0 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74   (mutex_init_ret
11700 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
11710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11720 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69  "Error.  Mutex i
11730 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
11740 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  iled.");.....ret
11750 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43  urn(CKR_CANT_LOC
11760 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  K);...}....cacke
11770 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
11780 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f   1;..}...CACKEY_
11790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
117a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
117b0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
117c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
117d0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
117e0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
117f0 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  Finalize)(CK_VOI
11800 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
11810 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
11820 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
11830 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
11840 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
11850 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
11860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11870 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
11880 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
11890 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
118a0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
118b0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
118c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
118d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
118e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
118f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
11900 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
11910 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
11920 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
11930 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
11940 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
11950 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
11960 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
11970 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
11980 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
11990 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
119a0 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
119b0 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
119c0 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  n(idx);...}..}..
119d0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
119e0 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
119f0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
11a00 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
11a10 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
11a20 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
11a30 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
11a40 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
11a50 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65  ots[idx].pcsc_re
11a60 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28  ader) {....free(
11a70 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
11a80 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ].pcsc_reader);.
11a90 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  ..}..}...cackey_
11aa0 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
11ab0 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  );...cackey_init
11ac0 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43  ialized = 0;...C
11ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ae0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
11af0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
11b00 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
11b10 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
11b20 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
11b30 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43  RV, C_GetInfo)(C
11b40 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  K_INFO_PTR pInfo
11b50 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
11b60 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74  TF8CHAR manufact
11b70 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e  urerID[] = "U.S.
11b80 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73   Government";..s
11b90 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
11ba0 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  R libraryDescrip
11bb0 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
11bc0 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ";...CACKEY_DEBU
11bd0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
11be0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
11bf0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
11c00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11c10 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
11c20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
11c30 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
11c40 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
11c50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
11c60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
11c70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11c80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
11c90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
11ca0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
11cb0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
11cc0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  ZED);..}...pInfo
11cd0 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
11ce0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b  n.major = ((CACK
11cf0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
11d00 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29  ION_CODE) >> 16)
11d10 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
11d20 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
11d30 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45  .minor = ((CACKE
11d40 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
11d50 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26  ON_CODE) >> 8) &
11d60 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28   0xff;...memset(
11d70 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
11d80 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
11d90 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
11da0 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
11db0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
11dc0 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
11dd0 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
11de0 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
11df0 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
11e00 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a  >flags = 0x00;..
11e10 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c  .memset(pInfo->l
11e20 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
11e30 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  n, ' ', sizeof(p
11e40 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
11e50 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
11e60 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  cpy(pInfo->libra
11e70 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c  ryDescription, l
11e80 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
11e90 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72  n, sizeof(librar
11ea0 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  yDescription) - 
11eb0 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  1);...pInfo->lib
11ec0 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  raryVersion.majo
11ed0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
11ee0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
11ef0 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
11f00 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d  libraryVersion.m
11f10 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
11f20 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
11f30 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  ) & 0xff;...CACK
11f40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11f50 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
11f60 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
11f70 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
11f80 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f  K);.}../*. * Pro
11f90 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61  cess list of rea
11fa0 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65  ders, and create
11fb0 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e   mapping between
11fc0 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64   reader name and
11fd0 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f   slot ID. */.CK_
11fe0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
11ff0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
12000 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74  List)(CK_BBOOL t
12010 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f  okenPresent, CK_
12020 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f  SLOT_ID_PTR pSlo
12030 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  tList, CK_ULONG_
12040 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
12050 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
12060 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e  l;..int pcsc_con
12070 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c  nect_ret;..CK_UL
12080 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  ONG count, slot_
12090 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73  count = 0, currs
120a0 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63  lot;..char *pcsc
120b0 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f  _readers, *pcsc_
120c0 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63  readers_s, *pcsc
120d0 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f  _readers_e;..DWO
120e0 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  RD pcsc_readers_
120f0 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
12100 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
12110 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72  ;..size_t curr_r
12120 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43  eader_len;...CAC
12130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12140 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
12150 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
12160 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
12170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
12180 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73  ror. pulCount is
12190 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
121a0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
121b0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
121c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
121d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
121e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
121f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
12200 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
12210 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
12220 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
12230 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
12240 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
12250 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
12260 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
12270 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
12280 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
12290 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
122a0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
122b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
122c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
122d0 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65  OR);..}.../* Cle
122e0 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  ar list of slots
122f0 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69   */..if (pSlotLi
12300 73 74 29 20 7b 0a 09 09 2f 2a 20 4f 6e 6c 79 20  st) {.../* Only 
12310 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
12320 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
12330 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
12340 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  g supply the slo
12350 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
12360 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
12370 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
12380 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c  ;....for (currsl
12390 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
123a0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
123b0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
123c0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
123d0 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
123e0 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79   {....if (cackey
123f0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
12400 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a  .pcsc_reader) {.
12410 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
12420 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
12430 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
12440 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
12450 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
12460 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09  eader = NULL;...
12470 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  .}.....cackey_sl
12480 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
12490 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  tive = 0;...}..}
124a0 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
124b0 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20  list of readers 
124c0 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  */..pcsc_connect
124d0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
124e0 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
124f0 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
12500 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
12510 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
12520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12530 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
12540 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61 73  PC/SC failed, as
12550 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22  suming no slots"
12560 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  );....slot_count
12570 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 0;..} else {.
12580 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  ..pcsc_readers_l
12590 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64  en = 0;....scard
125a0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
125b0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
125c0 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
125d0 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e  _handle, NULL, N
125e0 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ULL, &pcsc_reade
125f0 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73  rs_len);...if (s
12600 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
12610 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
12620 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f  SUCCESS && pcsc_
12630 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30  readers_len != 0
12640 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64  ) {....pcsc_read
12650 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73  ers = malloc(pcs
12660 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
12670 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
12680 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  s = pcsc_readers
12690 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74  ;.....scard_list
126a0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
126b0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
126c0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
126d0 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72  le, NULL, pcsc_r
126e0 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65  eaders, &pcsc_re
126f0 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69  aders_len);....i
12700 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61  f (scard_listrea
12710 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  ders_ret == SCAR
12720 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
12730 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
12740 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  e = pcsc_readers
12750 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   + pcsc_readers_
12760 6c 65 6e 3b 0a 0a 09 09 09 09 63 75 72 72 73 6c  len;......currsl
12770 6f 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c  ot = 0;.....whil
12780 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20  e (pcsc_readers 
12790 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  < pcsc_readers_e
127a0 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 72 65  ) {......curr_re
127b0 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65  ader_len = strle
127c0 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  n(pcsc_readers);
127d0 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73 63  .......if ((pcsc
127e0 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f  _readers + curr_
127f0 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63  reader_len) > pc
12800 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a  sc_readers_e) {.
12810 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
12820 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
12830 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d  rr_reader_len ==
12840 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61   0) {.......brea
12850 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
12860 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20  if (currslot >= 
12870 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
12880 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
12890 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
128a0 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
128b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
128c0 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72  ound more reader
128d0 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65  s than slots are
128e0 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a   available!");..
128f0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
12900 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59  ..}.......CACKEY
12910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
12920 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73 22  ound reader: %s"
12930 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  , pcsc_readers);
12940 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75  ......./* Only u
12950 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f  pdate the list o
12960 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72  f slots if we ar
12970 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  e actually being
12980 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
12990 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
129a0 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69  .....if (pSlotLi
129b0 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61 63 6b  st) {.......cack
129c0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
129d0 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  t].active = 1;..
129e0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
129f0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
12a00 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70  _reader = strdup
12a10 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a  (pcsc_readers);.
12a20 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
12a30 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
12a40 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
12a50 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b   = 0;.......cack
12a60 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
12a70 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t].transaction_d
12a80 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09  epth = 0;.......
12a90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
12aa0 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65  rslot].slot_rese
12ab0 74 20 3d 20 31 3b 0a 09 09 09 09 09 7d 0a 09 09  t = 1;......}...
12ac0 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
12ad0 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
12ae0 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
12af0 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
12b00 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
12b10 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  t > 0) {......sl
12b20 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72 73  ot_count = currs
12b30 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  lot;.....}....} 
12b40 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
12b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12b60 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53  Second call to S
12b70 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20  CardListReaders 
12b80 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25  failed, return %
12b90 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44  s/%li", CACKEY_D
12ba0 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
12bb0 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
12bc0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
12bd0 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c  , (long) scard_l
12be0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b  istreaders_ret);
12bf0 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70  ....}.....free(p
12c00 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a  csc_readers_s);.
12c10 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
12c20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12c30 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f  F("First call to
12c40 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
12c50 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
12c60 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
12c70 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
12c80 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
12c90 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
12ca0 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
12cb0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
12cc0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
12cd0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
12ce0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
12cf0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
12d00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
12d10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
12d20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12d30 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
12d40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
12d50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
12d60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
12d70 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  .if (pSlotList =
12d80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
12d90 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
12da0 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  nt;....CACKEY_DE
12db0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
12dc0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
12dd0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
12de0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
12df0 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75  .}...count = *pu
12e00 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75  lCount;..if (cou
12e10 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  nt < slot_count)
12e20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
12e30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12e40 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20   User allocated 
12e50 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74  %lu entries, but
12e60 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74   we have %lu ent
12e70 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73  ries.", count, s
12e80 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  lot_count);....r
12e90 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
12ea0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
12eb0 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
12ec0 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
12ed0 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 72   slot_count; cur
12ee0 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 53 6c  rslot++) {...pSl
12ef0 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d  otList[currslot]
12f00 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 7d 0a   = currslot;..}.
12f10 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
12f20 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
12f30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12f40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
12f50 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
12f60 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b  lu readers.", CK
12f70 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
12f80 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
12f90 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
12fa0 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73  OK);...tokenPres
12fb0 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65  ent = tokenPrese
12fc0 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  nt; /* Supress u
12fd0 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
12fe0 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
12ff0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
13000 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
13010 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
13020 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54   slotID, CK_SLOT
13030 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
13040 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
13050 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72  F8CHAR slotDescr
13060 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
13070 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d  ey Slot";..int m
13080 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
13090 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  t bytes_to_copy;
130a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
130b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
130c0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
130d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
130e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
130f0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
13100 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
13110 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
13120 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
13130 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
13140 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
13150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13160 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
13170 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
13180 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
13190 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
131a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
131b0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
131c0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
131d0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
131e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
131f0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
13200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13210 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
13220 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
13230 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
13240 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
13250 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
13260 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
13270 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
13280 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
13290 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
132a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
132b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
132c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
132d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
132e0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
132f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
13300 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
13310 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
13320 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
13330 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
13340 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
13350 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13360 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
13370 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
13380 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
13390 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
133a0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
133b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
133c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
133d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
133e0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
133f0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
13400 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
13410 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
13420 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
13430 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
13440 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13450 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
13460 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
13470 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
13480 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
13490 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
134a0 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
134b0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
134c0 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  of(pInfo->slotDe
134d0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
134e0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mcpy(pInfo->slot
134f0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f  Description, slo
13500 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  tDescription, si
13510 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70  zeof(slotDescrip
13520 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  tion) - 1);...me
13530 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
13540 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
13550 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
13560 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
13570 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
13580 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79   = strlen(cackey
13590 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70  _slots[slotID].p
135a0 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66  csc_reader);..if
135b0 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e   (sizeof(pInfo->
135c0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
135d0 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  < bytes_to_copy)
135e0 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f   {...bytes_to_co
135f0 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66  py = sizeof(pInf
13600 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
13610 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70  D);..}..memcpy(p
13620 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
13630 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f  erID, cackey_slo
13640 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
13650 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f  reader, bytes_to
13660 5f 63 6f 70 79 29 3b 0a 0a 09 70 49 6e 66 6f 2d  _copy);...pInfo-
13670 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52 45 4d  >flags = CKF_REM
13680 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 0a  OVABLE_DEVICE;..
13690 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
136a0 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
136b0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
136c0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
136d0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
136e0 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  {...pInfo->flags
136f0 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52   |= CKF_TOKEN_PR
13700 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 70 49 6e 66  ESENT;..}...pInf
13710 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69  o->hardwareVersi
13720 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
13730 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
13740 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
13750 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
13760 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
13770 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
13780 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  n() >> 8) & 0xff
13790 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  ;...pInfo->firmw
137a0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
137b0 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d   = 0x00;..pInfo-
137c0 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
137d0 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a  .minor = 0x00;..
137e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
137f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
13800 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
13810 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
13820 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
13830 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
13840 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e  K_RV, C_GetToken
13850 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
13860 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45   slotID, CK_TOKE
13870 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  N_INFO_PTR pInfo
13880 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
13890 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74  TF8CHAR manufact
138a0 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e  urerID[] = "U.S.
138b0 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73   Government";..s
138c0 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
138d0 52 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d  R defaultLabel[]
138e0 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65   = "Unknown Toke
138f0 6e 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  n";..static CK_U
13900 54 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20  TF8CHAR model[] 
13910 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09  = "CAC Token";..
13920 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
13930 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
13940 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75  c_identities;..u
13950 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
13960 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74  _certs;..ssize_t
13970 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74   label_ret;..int
13980 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
13990 69 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f  int use_default_
139a0 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  label;...CACKEY_
139b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
139c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
139d0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
139e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
139f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
13a00 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
13a10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
13a20 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
13a30 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
13a40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
13a50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13a60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
13a70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
13a80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
13a90 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
13aa0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
13ab0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
13ac0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
13ad0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
13ae0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
13af0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
13b00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13b10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
13b20 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
13b30 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
13b40 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
13b50 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
13b60 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
13b70 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
13b80 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
13b90 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
13ba0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
13bb0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
13bc0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
13bd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13be0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
13bf0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
13c00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
13c10 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
13c20 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
13c30 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
13c40 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
13c50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13c60 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
13c70 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
13c80 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
13c90 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
13ca0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
13cb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
13cc0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
13cd0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
13ce0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
13cf0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
13d00 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
13d10 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
13d20 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b  slotID]) != CACK
13d30 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
13d40 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  RESENT) {...CACK
13d50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13d60 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65  "No token is pre
13d70 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d  sent in slotID =
13d80 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a   %lu", slotID);.
13d90 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
13da0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
13db0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
13dc0 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f  n(CKR_TOKEN_NOT_
13dd0 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d  PRESENT);..}...m
13de0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
13df0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
13e00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
13e10 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
13e20 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
13e30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13e40 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
13e50 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
13e60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
13e70 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
13e80 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
13e90 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f   token label fro
13ea0 6d 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a  m certificates *
13eb0 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  /..memset(pInfo-
13ec0 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a  >label, ' ', siz
13ed0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
13ee0 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74  ));..use_default
13ef0 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 70 63  _label = 1;...pc
13f00 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
13f10 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
13f20 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
13f30 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26  slotID], NULL, &
13f40 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20  num_certs);..if 
13f50 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
13f60 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66   != NULL) {...if
13f70 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29   (num_certs > 0)
13f80 20 7b 0a 09 09 09 6c 61 62 65 6c 5f 72 65 74 20   {....label_ret 
13f90 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  = cackey_pcsc_id
13fa0 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28  entity_to_label(
13fb0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c  pcsc_identities,
13fc0 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73   pInfo->label, s
13fd0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
13fe0 65 6c 29 29 3b 0a 09 09 09 69 66 20 28 6c 61 62  el));....if (lab
13ff0 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09  el_ret > 0) {...
14000 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
14010 62 65 6c 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09  bel = 0;....}...
14020 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65  }....cackey_free
14030 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
14040 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
14050 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  s, 1);..}...if (
14060 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
14070 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49  l) {...memcpy(pI
14080 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61  nfo->label, defa
14090 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  ultLabel, sizeof
140a0 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d  (defaultLabel) -
140b0 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74   1);..}...memset
140c0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
140d0 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
140e0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
140f0 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65  acturerID));..me
14100 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
14110 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75  facturerID, manu
14120 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65  facturerID, size
14130 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49  of(manufacturerI
14140 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  D) - 1);...memse
14150 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20  t(pInfo->model, 
14160 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
14170 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d  o->model));..mem
14180 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  cpy(pInfo->model
14190 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28  , model, sizeof(
141a0 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d  model) - 1);...m
141b0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72  emset(pInfo->ser
141c0 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20  ialNumber, ' ', 
141d0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65  sizeof(pInfo->se
141e0 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09  rialNumber));...
141f0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74  memset(pInfo->ut
14200 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65  cTime, ' ', size
14210 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d  of(pInfo->utcTim
14220 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61  e));...pInfo->ha
14230 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61  rdwareVersion.ma
14240 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  jor = (cackey_ge
14250 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36  tversion() >> 16
14260 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
14270 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
14280 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65  n.minor = (cacke
14290 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
142a0 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70  > 8) & 0xff;...p
142b0 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
142c0 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78  rsion.major = 0x
142d0 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d  00;..pInfo->firm
142e0 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
142f0 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66  r = 0x00;...pInf
14300 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57  o->flags = CKF_W
14310 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c  RITE_PROTECTED |
14320 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e   CKF_USER_PIN_IN
14330 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f  ITIALIZED | CKF_
14340 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45  TOKEN_INITIALIZE
14350 44 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  D | CKF_LOGIN_RE
14360 51 55 49 52 45 44 3b 0a 0a 09 70 49 6e 66 6f 2d  QUIRED;...pInfo-
14370 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75  >ulMaxSessionCou
14380 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  nt = (sizeof(cac
14390 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
143a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
143b0 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b  ssions[0])) - 1;
143c0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69  ..pInfo->ulSessi
143d0 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41  onCount = CK_UNA
143e0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
143f0 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
14400 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  MaxRwSessionCoun
14410 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75  t = 0;..pInfo->u
14420 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  lRwSessionCount 
14430 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
14440 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
14450 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65  Info->ulMaxPinLe
14460 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d  n = 128;..pInfo-
14470 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30  >ulMinPinLen = 0
14480 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61  ;..pInfo->ulTota
14490 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20  lPublicMemory = 
144a0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
144b0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
144c0 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63  fo->ulFreePublic
144d0 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
144e0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
144f0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54  ION;..pInfo->ulT
14500 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72  otalPrivateMemor
14510 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
14520 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
14530 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72  .pInfo->ulFreePr
14540 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b  ivateMemory = CK
14550 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
14560 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b  ORMATION;...CACK
14570 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14580 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
14590 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
145a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
145b0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
145c0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
145d0 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76   C_WaitForSlotEv
145e0 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c  ent)(CK_FLAGS fl
145f0 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f  ags, CK_SLOT_ID_
14600 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f  PTR pSlotID, CK_
14610 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76  VOID_PTR pReserv
14620 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ed) {..CACKEY_DE
14630 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
14640 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65  ed.");...if (pRe
14650 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20  served != NULL) 
14660 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
14670 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
14680 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74  pReserved is not
14690 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
146a0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
146b0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
146c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
146d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
146e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
146f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
14700 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
14710 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
14720 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
14730 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
14740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
14750 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
14760 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
14770 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
14780 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
14790 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
147a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
147b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
147c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
147d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d  ON(CK_RV, C_GetM
147e0 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b  echanismList)(CK
147f0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
14800 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59   CK_MECHANISM_TY
14810 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  PE_PTR pMechanis
14820 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  mList, CK_ULONG_
14830 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
14840 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14850 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
14860 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
14870 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
14880 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14890 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
148a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
148b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
148c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
148d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
148e0 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
148f0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
14900 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
14910 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69  ror.  pulCount i
14920 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
14930 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
14940 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
14950 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74   (pMechanismList
14960 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   == NULL) {...*p
14970 75 6c 43 6f 75 6e 74 20 3d 20 33 3b 0a 0a 09 09  ulCount = 3;....
14980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14990 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
149a0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
149b0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
149c0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
149d0 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 33 29   (*pulCount < 3)
149e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
149f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14a00 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61    Buffer too sma
14a10 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ll.");....return
14a20 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f  (CKR_BUFFER_TOO_
14a30 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65  SMALL);..}...pMe
14a40 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d  chanismList[0] =
14a50 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09   CKM_RSA_PKCS;..
14a60 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 31  pMechanismList[1
14a70 5d 20 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41  ] = CKM_SHA1_RSA
14a80 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e  _PKCS;..*pulCoun
14a90 74 20 3d 20 32 3b 0a 0a 09 43 41 43 4b 45 59 5f  t = 2;...CACKEY_
14aa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
14ab0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
14ac0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
14ad0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
14ae0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
14af0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
14b00 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
14b10 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
14b20 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  tID, CK_MECHANIS
14b30 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f  M_TYPE type, CK_
14b40 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50  MECHANISM_INFO_P
14b50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74  TR pInfo) {..int
14b60 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
14b70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14b80 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
14b90 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
14ba0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
14bb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
14bc0 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
14bd0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
14be0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
14bf0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
14c00 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
14c10 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
14c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14c30 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
14c40 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
14c50 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
14c60 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
14c70 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
14c80 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
14c90 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
14ca0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
14cb0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
14cc0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
14cd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
14ce0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
14cf0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
14d00 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
14d10 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
14d20 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
14d30 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
14d40 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
14d50 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
14d60 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
14d70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
14d80 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
14d90 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
14da0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14db0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
14dc0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
14dd0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
14de0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
14df0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
14e00 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
14e10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14e20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14e30 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
14e40 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
14e50 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
14e60 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
14e70 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
14e80 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
14e90 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
14ea0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
14eb0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
14ec0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
14ed0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
14ee0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
14ef0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
14f00 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
14f10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14f20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
14f30 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
14f40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
14f50 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
14f60 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 68  ..}.../* XXX: Th
14f70 69 73 20 69 73 20 75 6e 74 65 73 74 65 64 2c 20  is is untested, 
14f80 61 6e 64 20 66 75 72 74 68 65 72 20 49 27 6d 20  and further I'm 
14f90 6e 6f 74 20 72 65 61 6c 6c 79 20 73 75 72 65 20  not really sure 
14fa0 69 66 20 74 68 69 73 20 69 73 20 63 6f 72 72 65  if this is corre
14fb0 63 74 2e 20 2a 2f 0a 09 73 77 69 74 63 68 20 28  ct. */..switch (
14fc0 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
14fd0 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  KM_RSA_PKCS:....
14fe0 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53  pInfo->ulMinKeyS
14ff0 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49  ize = 512;....pI
15000 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a  nfo->ulMaxKeySiz
15010 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e  e = 8192;....pIn
15020 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
15030 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54  HW | CKF_ENCRYPT
15040 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c   | CKF_DECRYPT |
15050 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f   CKF_SIGN | CKF_
15060 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b  VERIFY;....break
15070 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  ;...case CKM_RSA
15080 5f 58 5f 35 30 39 3a 0a 09 09 09 70 49 6e 66 6f  _X_509:....pInfo
15090 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d  ->ulMinKeySize =
150a0 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e   512;....pInfo->
150b0 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38  ulMaxKeySize = 8
150c0 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66  192;....pInfo->f
150d0 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20  lags = CKF_HW | 
150e0 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b  CKF_ENCRYPT | CK
150f0 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f  F_DECRYPT | CKF_
15100 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46  SIGN | CKF_VERIF
15110 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  Y;....break;...c
15120 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41  ase CKM_SHA1_RSA
15130 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d  _PKCS:....pInfo-
15140 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20  >ulMinKeySize = 
15150 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  512;....pInfo->u
15160 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31  lMaxKeySize = 81
15170 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c  92;....pInfo->fl
15180 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43  ags = CKF_HW | C
15190 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45  KF_SIGN | CKF_VE
151a0 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  RIFY;....break;.
151b0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
151c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
151d0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
151e0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
151f0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
15200 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
15210 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
15220 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
15230 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
15240 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c  InitToken)(CK_SL
15250 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
15260 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
15270 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
15280 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48  inLen, CK_UTF8CH
15290 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b  AR_PTR pLabel) {
152a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
152b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
152c0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
152d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
152e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
152f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
15300 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
15310 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
15320 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
15330 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
15340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15350 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
15360 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
15370 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20  ROTECTED (%i)", 
15380 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
15390 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65  PROTECTED);...re
153a0 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57  turn(CKR_TOKEN_W
153b0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
153c0 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
153d0 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
153e0 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
153f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
15400 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f  , C_InitPIN)(CK_
15410 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
15420 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38  Session, CK_UTF8
15430 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
15440 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
15450 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
15460 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
15470 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
15480 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
15490 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
154a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
154b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
154c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
154d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
154e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
154f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15500 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
15510 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
15520 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
15530 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
15540 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
15550 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
15560 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
15570 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e  D);.}../* We don
15580 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20  't support this 
15590 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45  method. */.CK_DE
155a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
155b0 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43  _RV, C_SetPIN)(C
155c0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
155d0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54   hSession, CK_UT
155e0 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50  F8CHAR_PTR pOldP
155f0 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f  in, CK_ULONG ulO
15600 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46  ldPinLen, CK_UTF
15610 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69  8CHAR_PTR pNewPi
15620 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65  n, CK_ULONG ulNe
15630 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  wPinLen) {..CACK
15640 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15650 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
15660 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
15670 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
15680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15690 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
156a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
156b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
156c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
156d0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
156e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
156f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
15700 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
15710 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
15720 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
15730 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
15740 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
15750 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
15760 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
15770 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65  ION(CK_RV, C_Ope
15780 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f  nSession)(CK_SLO
15790 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
157a0 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f  FLAGS flags, CK_
157b0 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63  VOID_PTR pApplic
157c0 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59  ation, CK_NOTIFY
157d0 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53   notify, CK_SESS
157e0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ION_HANDLE_PTR p
157f0 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73  hSession) {..uns
15800 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a  igned long idx;.
15810 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
15820 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65  l;..int found_se
15830 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43  ssion = 0;...CAC
15840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15850 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
15860 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f  f ((flags & CKF_
15870 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20  SERIAL_SESSION) 
15880 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45  != CKF_SERIAL_SE
15890 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72  SSION) {...retur
158a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41  n(CKR_SESSION_PA
158b0 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f  RALLEL_NOT_SUPPO
158c0 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RTED);..}...if (
158d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
158e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
158f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
15900 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
15910 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
15920 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
15930 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
15940 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
15950 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
15960 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
15970 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
15980 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
15990 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
159a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
159b0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
159c0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
159d0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
159e0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
159f0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
15a00 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
15a10 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
15a20 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
15a30 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
15a40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
15a50 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
15a60 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
15a70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
15a80 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
15a90 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
15aa0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
15ab0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
15ac0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
15ad0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
15ae0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15af0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15b00 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
15b10 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
15b20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
15b30 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
15b40 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
15b50 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
15b60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
15b70 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
15b80 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
15b90 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
15ba0 20 74 68 65 20 63 61 72 64 20 69 73 20 61 63 74   the card is act
15bb0 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f  ually in the slo
15bc0 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43  t. */../* XXX: C
15bd0 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
15be0 65 20 74 68 69 73 20 69 73 20 69 6e 20 74 68 65  e this is in the
15bf0 20 50 4b 43 53 23 31 31 20 73 70 65 63 69 66 69   PKCS#11 specifi
15c00 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63  cation */..if (c
15c10 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
15c20 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ent(&cackey_slot
15c30 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41  s[slotID]) != CA
15c40 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
15c50 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41  NPRESENT) {...CA
15c60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15c70 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20  F("Error.  Card 
15c80 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65  not present.  Re
15c90 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49  turning CKR_DEVI
15ca0 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09  CE_REMOVED");...
15cb0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
15cc0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
15cd0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
15ce0 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
15cf0 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  ED);..}...for (i
15d00 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73  dx = 1; idx < (s
15d10 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
15d20 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
15d30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
15d40 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
15d50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
15d60 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
15d70 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65  e) {....found_se
15d80 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a  ssion = 1;.....*
15d90 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b  phSession = idx;
15da0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
15db0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
15dc0 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 1;....cackey_
15dd0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c  sessions[idx].sl
15de0 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09  otID = slotID;..
15df0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
15e00 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43  s[idx].state = C
15e10 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53  KS_RO_PUBLIC_SES
15e20 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f  SION;....cackey_
15e30 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c  sessions[idx].fl
15e40 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09  ags = flags;....
15e50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
15e60 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72  idx].ulDeviceErr
15e70 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65  or = 0;....cacke
15e80 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
15e90 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70  pApplication = p
15ea0 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09  Application;....
15eb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
15ec0 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f  idx].Notify = no
15ed0 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79  tify;.....cackey
15ee0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
15ef0 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c  dentities = NULL
15f00 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
15f10 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
15f20 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ties_count = 0;.
15f30 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
15f40 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f  ons[idx].search_
15f50 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
15f60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
15f70 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  idx].sign_active
15f80 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
15f90 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64  _sessions[idx].d
15fa0 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20  ecrypt_active = 
15fb0 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  0;.....cackey_se
15fc0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
15fd0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
15fe0 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
15ff0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
16000 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73  otID], &cackey_s
16010 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
16020 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
16030 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
16040 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
16050 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
16060 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
16070 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
16080 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
16090 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
160a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
160b0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
160c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
160d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
160e0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66  OR);..}...if (!f
160f0 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a  ound_session) {.
16100 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16110 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
16120 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55   CKR_SESSION_COU
16130 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45  NT (%i)", CKR_SE
16140 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09  SSION_COUNT);...
16150 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
16160 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a  ION_COUNT);..}..
16170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16180 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
16190 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
161a0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
161b0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
161c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
161d0 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73  K_RV, C_CloseSes
161e0 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  sion)(CK_SESSION
161f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
16200 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
16210 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
16220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
16230 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
16240 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
16250 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
16260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16270 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
16280 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
16290 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
162a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
162b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
162c0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
162d0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
162e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
162f0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
16300 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
16310 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16320 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16330 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
16340 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
16350 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
16360 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
16370 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
16380 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
16390 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
163a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
163b0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
163c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
163d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
163e0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
163f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
16400 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
16410 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
16420 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
16430 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
16440 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
16450 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
16460 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
16470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16480 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
16490 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
164a0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
164b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
164c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
164d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
164e0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d  ession].active =
164f0 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65   0;..cackey_free
16500 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b  _identities(cack
16510 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
16520 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
16530 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
16540 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
16550 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
16560 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
16570 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
16580 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
16590 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
165a0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
165b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
165c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
165d0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
165e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
165f0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
16600 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
16610 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
16620 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
16630 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
16640 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
16650 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
16660 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f  ION(CK_RV, C_Clo
16670 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43  seAllSessions)(C
16680 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
16690 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
166a0 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
166b0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
166c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
166d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
166e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
166f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
16700 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16710 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
16720 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
16730 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
16740 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
16750 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
16760 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
16770 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
16780 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
16790 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
167a0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
167b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
167c0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
167d0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
167e0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
167f0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
16800 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
16810 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
16820 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
16830 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
16840 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
16850 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
16860 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
16870 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
16880 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16890 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
168a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
168b0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
168c0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
168d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
168e0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
168f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16900 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16910 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
16920 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
16930 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
16940 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
16950 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
16960 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
16970 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
16980 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
16990 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
169a0 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
169b0 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
169c0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
169d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
169e0 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
169f0 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
16a00 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
16a10 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20  active) {....if 
16a20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
16a30 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20  [idx].slotID != 
16a40 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f  slotID) {.....co
16a50 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
16a60 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
16a70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
16a80 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65  ock);....C_Close
16a90 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09  Session(idx);...
16aa0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f  .cackey_mutex_lo
16ab0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
16ac0 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  k);...}..}...mut
16ad0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
16ae0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
16af0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
16b00 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
16b10 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
16b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16b30 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
16b40 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
16b50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
16b60 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
16b70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16b80 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
16b90 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
16ba0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
16bb0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
16bc0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
16bd0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73  CK_RV, C_GetSess
16be0 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53  ionInfo)(CK_SESS
16bf0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
16c00 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion, CK_SESSION_
16c10 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
16c20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
16c30 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
16c40 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
16c50 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
16c60 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
16c70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16c80 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
16c90 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
16ca0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
16cb0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
16cc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
16cd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
16ce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16cf0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
16d00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
16d10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
16d20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
16d30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
16d40 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
16d50 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
16d60 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
16d70 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
16d80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
16d90 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
16da0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
16db0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
16dc0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
16dd0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
16de0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
16df0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
16e00 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
16e10 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
16e20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
16e30 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
16e40 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
16e50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16e60 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
16e70 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
16e80 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
16e90 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
16ea0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
16eb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
16ec0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
16ed0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
16ee0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
16ef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16f00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
16f10 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
16f20 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
16f30 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
16f40 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
16f50 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49  }...pInfo->slotI
16f60 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
16f70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
16f80 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74  otID;..pInfo->st
16f90 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ate = cackey_ses
16fa0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
16fb0 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66  state;..pInfo->f
16fc0 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65  lags = cackey_se
16fd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
16fe0 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e  .flags;..pInfo->
16ff0 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20  ulDeviceError = 
17000 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
17010 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69  hSession].ulDevi
17020 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78  ceError;...mutex
17030 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
17040 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
17050 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
17060 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
17070 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
17080 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17090 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
170a0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
170b0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
170c0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
170d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
170e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
170f0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
17100 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
17110 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
17120 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
17130 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74  _RV, C_GetOperat
17140 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53  ionState)(CK_SES
17150 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
17160 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
17170 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  R pOperationStat
17180 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
17190 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  pulOperationStat
171a0 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
171b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
171c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
171d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
171e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
171f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17200 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
17210 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
17220 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
17230 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
17240 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
17250 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
17260 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
17270 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
17280 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
17290 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
172a0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
172b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
172c0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
172d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
172e0 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65  (CK_RV, C_SetOpe
172f0 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f  rationState)(CK_
17300 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
17310 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
17320 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53  _PTR pOperationS
17330 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  tate, CK_ULONG u
17340 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c  lOperationStateL
17350 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  en, CK_OBJECT_HA
17360 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e  NDLE hEncryption
17370 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Key, CK_OBJECT_H
17380 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63  ANDLE hAuthentic
17390 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43  ationKey) {..CAC
173a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
173b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
173c0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
173d0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
173e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
173f0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
17400 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
17410 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
17420 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
17430 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
17440 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17450 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
17460 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
17470 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
17480 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
17490 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
174a0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
174b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
174c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
174d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
174e0 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  gin)(CK_SESSION_
174f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
17500 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73   CK_USER_TYPE us
17510 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43  erType, CK_UTF8C
17520 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
17530 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
17540 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
17550 74 76 61 6c 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e  tval;..int login
17560 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
17570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
17580 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
17590 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
175a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
175b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
175c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
175d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
175e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
175f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
17600 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
17610 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
17620 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
17630 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
17640 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
17650 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
17660 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17670 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
17680 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
17690 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
176a0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
176b0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
176c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54  ;..}...if (userT
176d0 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29  ype != CKU_USER)
176e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
176f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
17700 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72    We only suppor
17710 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b  t USER mode, ask
17720 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e  ed for %lu mode.
17730 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
17740 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09  g) userType)....
17750 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f  return(CKR_USER_
17760 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  TYPE_INVALID);..
17770 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
17780 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
17790 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
177a0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
177b0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
177c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
177d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
177e0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
177f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17800 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
17810 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
17820 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
17830 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
17840 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
17850 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
17860 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
17870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17880 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
17890 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
178a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
178b0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
178c0 49 44 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f  ID);..}...login_
178d0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67  ret = cackey_log
178e0 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  in(&cackey_slots
178f0 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  [cackey_sessions
17900 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
17910 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c  D], pPin, ulPinL
17920 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  en, NULL);..if (
17930 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43  login_ret != CAC
17940 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
17950 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
17960 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
17970 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c  glock);....if (l
17980 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
17990 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
179a0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
179b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
179c0 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63  r.  Token is loc
179d0 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  ked.");.....retu
179e0 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45  rn(CKR_PIN_LOCKE
179f0 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20  D);...} else if 
17a00 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41  (login_ret == CA
17a10 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
17a20 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  IN) {....CACKEY_
17a30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17a40 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49  ror.  Invalid PI
17a50 4e 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  N.");.....return
17a60 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
17a70 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  CT);...}....CACK
17a80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17a90 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e  "Error.  Unknown
17aa0 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20   error returned 
17ab0 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69  from cackey_logi
17ac0 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e  n() (%i)", login
17ad0 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
17ae0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
17af0 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  OR);..}...cackey
17b00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
17b10 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  on].state = CKS_
17b20 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e  RO_USER_FUNCTION
17b30 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  S;...mutex_retva
17b40 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
17b50 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
17b60 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
17b70 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
17b80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
17b90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
17ba0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
17bb0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
17bc0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
17bd0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
17be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17bf0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
17c00 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
17c10 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
17c20 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
17c30 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
17c40 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53  _Logout)(CK_SESS
17c50 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
17c60 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  ion) {..int mute
17c70 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
17c80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17c90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
17ca0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
17cb0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
17cc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17cd0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
17ce0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
17cf0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
17d00 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
17d10 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
17d20 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
17d30 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
17d40 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
17d50 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
17d60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
17d70 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
17d80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17d90 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
17da0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
17db0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
17dc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
17dd0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
17de0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
17df0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
17e00 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
17e10 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
17e20 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
17e30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17e40 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
17e50 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
17e60 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
17e70 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
17e80 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
17e90 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
17ea0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
17eb0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
17ec0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
17ed0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17ee0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
17ef0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
17f00 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
17f10 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
17f20 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
17f30 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
17f40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
17f50 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
17f60 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 6d 75 74 65  _SESSION;...mute
17f70 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
17f80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
17f90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
17fa0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
17fb0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
17fc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17fd0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
17fe0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
17ff0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
18000 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
18010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18020 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
18030 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
18040 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
18050 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
18060 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
18070 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62  K_RV, C_CreateOb
18080 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ject)(CK_SESSION
18090 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
180a0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
180b0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
180c0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
180d0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
180e0 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b  _PTR phObject) {
180f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18100 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
18110 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
18120 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
18130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18140 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
18150 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
18160 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18170 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
18180 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
18190 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
181a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
181b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
181c0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
181d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
181e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
181f0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
18200 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
18210 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
18220 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
18230 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43   C_CopyObject)(C
18240 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
18250 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
18260 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
18270 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
18280 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
18290 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
182a0 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
182b0 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a  DLE_PTR phNewObj
182c0 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ect) {..CACKEY_D
182d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
182e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
182f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
18300 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
18310 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18320 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
18330 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
18340 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
18350 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
18360 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
18370 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
18380 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
18390 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
183a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
183b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
183c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
183d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
183e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
183f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
18400 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79  CK_RV, C_Destroy
18410 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
18420 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
18430 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
18440 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a  NDLE hObject) {.
18450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18460 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
18470 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
18480 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
18490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
184a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
184b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
184c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
184d0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
184e0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
184f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18500 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
18510 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
18520 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
18530 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
18540 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
18550 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
18560 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
18570 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
18580 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
18590 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29  C_GetObjectSize)
185a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
185b0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
185c0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
185d0 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  bject, CK_ULONG_
185e0 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09  PTR pulSize) {..
185f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18600 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
18610 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
18620 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
18630 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18640 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
18650 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
18660 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
18670 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
18680 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
18690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
186a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
186b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
186c0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
186d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
186e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
186f0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
18700 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
18710 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
18720 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
18730 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
18740 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ue)(CK_SESSION_H
18750 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
18760 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
18770 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
18780 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
18790 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
187a0 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54  lCount) {..CK_AT
187b0 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
187c0 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  tr;..struct cack
187d0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
187e0 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64  ntity;..unsigned
187f0 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69   long identity_i
18800 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65  dx, attr_idx, se
18810 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d  ss_attr_idx, num
18820 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ids;..int mutex
18830 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
18840 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
18850 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56  ..CK_VOID_PTR pV
18860 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  alue;..CK_ULONG 
18870 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41  ulValueLen;...CA
18880 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18890 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
188a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
188b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
188c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
188d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
188e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
188f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
18900 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
18910 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
18920 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
18930 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
18940 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
18950 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
18960 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
18970 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
18980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18990 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
189a0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
189b0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
189c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
189d0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
189e0 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b  (hObject == 0) {
189f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18a00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
18a10 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75  Object handle ou
18a20 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
18a30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
18a40 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56  BJECT_HANDLE_INV
18a50 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
18a60 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ulCount == 0) {.
18a70 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
18a80 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65  it, if zero obje
18a90 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69  cts were specifi
18aa0 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  ed return zero i
18ab0 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  tems immediately
18ac0 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
18ad0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
18ae0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
18af0 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
18b00 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
18b10 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
18b20 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74  }...if (pTemplat
18b30 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
18b40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18b50 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d  TF("Error.  pTem
18b60 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29  plate is NULL.")
18b70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18b80 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
18b90 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69 64  .}...identity_id
18ba0 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b  x = hObject - 1;
18bb0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
18bc0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
18bd0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
18be0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
18bf0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
18c00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18c10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
18c20 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
18c30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
18c40 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
18c50 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
18c60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
18c70 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
18c80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
18c90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
18ca0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
18cb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18cc0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
18cd0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
18ce0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
18cf0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
18d00 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73  D);..}...num_ids
18d10 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
18d20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
18d30 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a  ntities_count;..
18d40 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64  .if (identity_id
18d50 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a  x >= num_ids) {.
18d60 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
18d70 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
18d80 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
18d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18da0 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61  rror.  Object ha
18db0 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
18dc0 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78  e.  identity_idx
18dd0 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20   = %lu, num_ids 
18de0 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e  = %lu.", (unsign
18df0 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74  ed long) identit
18e00 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64  y_idx, (unsigned
18e10 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b   long) num_ids);
18e20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
18e30 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56  BJECT_HANDLE_INV
18e40 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e  ALID);..}...iden
18e50 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73  tity = &cackey_s
18e60 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18e70 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65  ].identities[ide
18e80 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f  ntity_idx];...fo
18e90 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  r (attr_idx = 0;
18ea0 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f   attr_idx < ulCo
18eb0 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29  unt; attr_idx++)
18ec0 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d   {...curr_attr =
18ed0 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72   &pTemplate[attr
18ee0 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65  _idx];....pValue
18ef0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c   = NULL;...ulVal
18f00 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
18f10 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ) -1;....CACKEY_
18f20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f  DEBUG_PRINTF("Lo
18f30 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62  oking for attrib
18f40 75 74 65 20 30 78 25 30 38 6c 78 20 28 69 64 65  ute 0x%08lx (ide
18f50 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c  ntity:%lu) ...",
18f60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18f70 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65   curr_attr->type
18f80 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18f90 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b  ) identity_idx);
18fa0 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74  ....for (sess_at
18fb0 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73  tr_idx = 0; sess
18fc0 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e  _attr_idx < iden
18fd0 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
18fe0 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74  _count; sess_att
18ff0 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66  r_idx++) {....if
19000 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72   (identity->attr
19010 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
19020 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75  _idx].type == cu
19030 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b  rr_attr->type) {
19040 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19050 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66  G_PRINTF(" ... f
19060 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20  ound it, pValue 
19070 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e  = %p, ulValueLen
19080 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74   = %lu", identit
19090 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
190a0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61  ss_attr_idx].pVa
190b0 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61  lue, identity->a
190c0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
190d0 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
190e0 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70  Len);..........p
190f0 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79  Value = identity
19100 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
19110 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c  s_attr_idx].pVal
19120 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
19130 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61  en = identity->a
19140 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
19150 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
19160 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  Len;....}...}...
19170 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e  .if (curr_attr->
19180 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65  pValue && pValue
19190 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f  ) {....if (curr_
191a0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
191b0 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20   >= ulValueLen) 
191c0 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72  {.....memcpy(cur
191d0 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20  r_attr->pValue, 
191e0 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c  pValue, ulValueL
191f0 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  en);....} else {
19200 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
19210 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
19220 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
19230 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
19240 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  LL;....}...}....
19250 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
19260 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c  ueLen = ulValueL
19270 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  en;..}...mutex_r
19280 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
19290 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
192a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
192b0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
192c0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
192d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
192e0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
192f0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
19300 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
19310 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
19320 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f   (retval == CKR_
19330 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49  ATTRIBUTE_TYPE_I
19340 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b  NVALID) {...CACK
19350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19360 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41  "Returning CKR_A
19370 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e  TTRIBUTE_TYPE_IN
19380 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e  VALID (%i)", (in
19390 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65  t) retval);..} e
193a0 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d  lse if (retval =
193b0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
193c0 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  _SMALL) {...CACK
193d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
193e0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42  "Returning CKR_B
193f0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20  UFFER_TOO_SMALL 
19400 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74  (%i)", (int) ret
19410 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66  val);..} else if
19420 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f   (retval == CKR_
19430 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
19440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
19450 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
19460 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  i)", (int) retva
19470 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  l);..} else {...
19480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19490 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
194a0 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  i", (int) retval
194b0 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72  );..}...return(r
194c0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
194d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
194e0 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62  _RV, C_SetAttrib
194f0 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53  uteValue)(CK_SES
19500 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
19510 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
19520 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
19530 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
19540 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
19550 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a  LONG ulCount) {.
19560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19570 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
19580 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
19590 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
195a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
195b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
195c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
195d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
195e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
195f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
19600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19610 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
19620 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
19630 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
19640 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
19650 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
19660 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
19670 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
19680 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
19690 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
196a0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
196b0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
196c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
196d0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
196e0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
196f0 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
19700 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
19710 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
19720 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
19730 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
19740 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
19750 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19760 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
19770 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
19780 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
19790 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
197a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
197b0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
197c0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
197d0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
197e0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
197f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
19800 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
19810 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19820 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
19830 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
19840 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
19850 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
19860 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
19870 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
19880 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
19890 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
198a0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
198b0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
198c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
198d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
198e0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
198f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
19900 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
19910 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
19920 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
19930 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
19940 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
19950 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
19960 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
19970 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
19980 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
19990 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
199a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
199b0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
199c0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
199d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
199e0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
199f0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
19a00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
19a10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
19a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19a30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
19a40 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63  earch already ac
19a50 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
19a60 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
19a70 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
19a80 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
19a90 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s[cackey_session
19aa0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
19ab0 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20  ID].slot_reset) 
19ac0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19ad0 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f  _PRINTF("The slo
19ae0 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74  t has been reset
19af0 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c   since we last l
19b00 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69  ooked for identi
19b10 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69  ties -- rescanni
19b20 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63  ng");....if (cac
19b30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19b40 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
19b50 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
19b60 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
19b70 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65  tities(cackey_se
19b80 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
19b90 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63  .identities, cac
19ba0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19bb0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
19bc0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61  s_count);.....ca
19bd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
19be0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
19bf0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
19c00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
19c10 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
19c20 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  es_count = 0;...
19c30 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
19c40 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s[cackey_session
19c50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
19c60 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ID].slot_reset =
19c70 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63   0;..}...if (cac
19c80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19c90 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
19ca0 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
19cb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19cc0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
19cd0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
19ce0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61  d_identities(&ca
19cf0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65  ckey_slots[cacke
19d00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19d10 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 26 63  ion].slotID], &c
19d20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19d30 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
19d40 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ies_count);..}..
19d50 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21  .if (pTemplate !
19d60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
19d70 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
19d80 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
19d90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
19da0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
19db0 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61  = ulCount;....ca
19dc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
19dd0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
19de0 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c  uery = malloc(ul
19df0 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  Count * sizeof(*
19e00 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09  pTemplate));....
19e10 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
19e20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
19e30 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20  ].search_query, 
19e40 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75  pTemplate, ulCou
19e50 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
19e60 6d 70 6c 61 74 65 29 29 3b 0a 09 09 7d 20 65 6c  mplate));...} el
19e70 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  se {....cackey_s
19e80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
19e90 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
19ea0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63  ount = 0;....cac
19eb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19ec0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
19ed0 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  ery = NULL;...}.
19ee0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
19ef0 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
19f00 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
19f10 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
19f20 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b  glock);.....CACK
19f30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19f40 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
19f50 71 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20  query specified 
19f60 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d  as NULL, but num
19f70 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72  ber of query ter
19f80 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  ms not specified
19f90 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65   as 0.");.....re
19fa0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
19fb0 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09  TS_BAD);...}....
19fc0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19fd0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
19fe0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
19ff0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
1a000 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1a010 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c  arch_query = NUL
1a020 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  L;..}...cackey_s
1a030 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1a040 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
1a050 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  = 1;..cackey_ses
1a060 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1a070 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d  search_curr_id =
1a080 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76   0;...mutex_retv
1a090 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1a0a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1a0b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1a0c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1a0d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a0e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a0f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1a100 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1a110 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1a120 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1a130 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a140 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1a150 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1a160 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1a170 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1a180 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1a190 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43  C_FindObjects)(C
1a1a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1a1b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
1a1c0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
1a1d0 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f  phObject, CK_ULO
1a1e0 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  NG ulMaxObjectCo
1a1f0 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  unt, CK_ULONG_PT
1a200 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  R pulObjectCount
1a210 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
1a220 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72  ey_identity *cur
1a230 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42  r_id;..CK_ATTRIB
1a240 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
1a250 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69  .CK_ULONG curr_i
1a260 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f  d_idx, curr_out_
1a270 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74  id_idx, curr_att
1a280 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
1a290 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _idx;..CK_ULONG 
1a2a0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70  matched_count, p
1a2b0 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
1a2c0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
1a2d0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
1a2e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1a2f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1a300 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1a310 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1a320 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a330 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1a340 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1a350 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1a360 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1a370 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a  ..}...if (pulObj
1a380 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  ectCount == NULL
1a390 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a3a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a3b0 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  .  pulObjectCoun
1a3c0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
1a3d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1a3e0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1a3f0 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d  .if (phObject ==
1a400 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62   NULL && ulMaxOb
1a410 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
1a420 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
1a430 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
1a440 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
1a450 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
1a460 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
1a470 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65  ly */...*pulObje
1a480 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  ctCount = 0;....
1a490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a4a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1a4b0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
1a4c0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
1a4d0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
1a4e0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
1a4f0 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
1a500 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1a510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a520 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73  or.  phObject is
1a530 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1a540 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1a550 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1a560 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  (ulMaxObjectCoun
1a570 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
1a580 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a590 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d  "Error.  Maximum
1a5a0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
1a5b0 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ts specified as 
1a5c0 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75  zero.");....retu
1a5d0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1a5e0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1a5f0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1a600 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1a610 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1a620 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1a630 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1a640 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1a650 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1a660 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1a670 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1a680 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1a690 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1a6a0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1a6b0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1a6c0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1a6d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1a6e0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1a6f0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1a700 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a710 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1a720 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1a730 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1a740 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1a750 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1a760 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1a770 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1a780 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1a790 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1a7a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a7b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1a7c0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
1a7d0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1a7e0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1a7f0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1a800 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1a810 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1a820 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
1a830 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1a840 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1a850 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1a860 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a870 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
1a880 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1a890 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1a8a0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
1a8b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1a8c0 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
1a8d0 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
1a8e0 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79  _id_idx = cackey
1a8f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1a900 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
1a910 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20  id; curr_id_idx 
1a920 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
1a930 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1a940 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20  tities_count && 
1a950 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
1a960 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29  ; curr_id_idx++)
1a970 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26   {...curr_id = &
1a980 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1a990 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1a9a0 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78  ties[curr_id_idx
1a9b0 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ];....CACKEY_DEB
1a9c0 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65  UG_PRINTF("Proce
1a9d0 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  ssing identity:%
1a9e0 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
1a9f0 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78  ong) curr_id_idx
1aa00 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f  );....matched_co
1aa10 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20  unt = 0;....for 
1aa20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d  (curr_attr_idx =
1aa30 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64   0; curr_attr_id
1aa40 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
1aa50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1aa60 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
1aa70 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b  ; curr_attr_idx+
1aa80 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74  +) {....prev_mat
1aa90 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74  ched_count = mat
1aaa0 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09  ched_count;.....
1aab0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63  curr_attr = &cac
1aac0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1aad0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1aae0 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64  ery[curr_attr_id
1aaf0 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  x];.....CACKEY_D
1ab00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43  EBUG_PRINTF("  C
1ab10 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  hecking for attr
1ab20 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 69 6e  ibute 0x%08lx in
1ab30 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22   identity:%i..."
1ab40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ab50 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  ) curr_attr->typ
1ab60 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  e, (int) curr_id
1ab70 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59  _idx);....CACKEY
1ab80 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
1ab90 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69  "    Value looki
1aba0 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61  ng for:", curr_a
1abb0 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72  ttr->pValue, cur
1abc0 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
1abd0 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65  en);.....for (se
1abe0 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
1abf0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
1ac00 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
1ac10 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73  utes_count; sess
1ac20 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
1ac30 09 09 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e  ...if (curr_id->
1ac40 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
1ac50 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d  attr_idx].type =
1ac60 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  = curr_attr->typ
1ac70 65 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  e) {......CACKEY
1ac80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1ac90 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74     ... found mat
1aca0 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29  ching type ...")
1acb0 3b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
1acc0 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
1acd0 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a    ... our value:
1ace0 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  ", curr_id->attr
1acf0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
1ad00 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75  _idx].pValue, cu
1ad10 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
1ad20 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
1ad30 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  .ulValueLen);...
1ad40 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
1ad50 72 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c  r->pValue == NUL
1ad60 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  L) {.......CACKE
1ad70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ad80 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
1ad90 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22   wildcard match"
1ada0 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68 65  );........matche
1adb0 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09  d_count++;......
1adc0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
1add0 0a 20 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  . .....if (curr_
1ade0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
1adf0 20 3d 3d 20 63 75 72 72 5f 69 64 2d 3e 61 74 74   == curr_id->att
1ae00 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
1ae10 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  r_idx].ulValueLe
1ae20 6e 20 26 26 20 6d 65 6d 63 6d 70 28 63 75 72 72  n && memcmp(curr
1ae30 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
1ae40 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
1ae50 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1ae60 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69  ].pValue, curr_i
1ae70 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
1ae80 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
1ae90 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b  alueLen) == 0) {
1aea0 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1aeb0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
1aec0 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61     ... found exa
1aed0 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09  ct match");.....
1aee0 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ...matched_count
1aef0 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ++;........break
1af00 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
1af10 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68  ..}...../* If th
1af20 65 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c  e attribute coul
1af30 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64  d not be matched
1af40 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  , do not try to 
1af50 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c  match additional
1af60 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09   attributes */..
1af70 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68  ..if (prev_match
1af80 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63  ed_count == matc
1af90 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  hed_count) {....
1afa0 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
1afb0 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f  ....if (matched_
1afc0 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f  count == cackey_
1afd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1afe0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
1aff0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
1b000 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b010 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74  "  ... All %i at
1b020 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64  tributes checked
1b030 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69   for found, addi
1b040 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74  ng identity:%i t
1b050 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22  o returned list"
1b060 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73  , (int) cackey_s
1b070 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b080 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
1b090 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72  ount, (int) curr
1b0a0 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68  _id_idx);.....ph
1b0b0 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f  Object[curr_out_
1b0c0 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69  id_idx] = curr_i
1b0d0 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75  d_idx + 1;.....u
1b0e0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d  lMaxObjectCount-
1b0f0 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f  -;.....curr_out_
1b100 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c  id_idx++;...} el
1b110 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
1b120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
1b130 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f  .. Not all %i (o
1b140 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74  nly found %i) at
1b150 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64  tributes checked
1b160 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20   for found, not 
1b170 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a  adding identity:
1b180 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65  %i", (int) cacke
1b190 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1b1a0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1b1b0 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d  y_count, (int) m
1b1c0 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69  atched_count, (i
1b1d0 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
1b1e0 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79  ;...}..}..cackey
1b1f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1b200 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
1b210 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78  id = curr_id_idx
1b220 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  ;..*pulObjectCou
1b230 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64  nt = curr_out_id
1b240 5f 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  _idx;...mutex_re
1b250 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1b260 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1b270 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1b280 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1b290 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1b2a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b2b0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1b2c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1b2d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1b2e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1b2f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b300 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1b310 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a  OK (%i), num obj
1b320 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52  ects = %lu", CKR
1b330 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43  _OK, *pulObjectC
1b340 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ount);...return(
1b350 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1b360 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1b370 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
1b380 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ctsFinal)(CK_SES
1b390 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1b3a0 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  sion) {..int mut
1b3b0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1b3c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b3d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1b3e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1b3f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1b400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b410 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1b420 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1b430 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1b440 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1b450 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
1b460 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1b470 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1b480 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1b490 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1b4a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1b4b0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1b4c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b4d0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1b4e0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1b4f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1b500 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1b510 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1b520 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1b530 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1b540 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1b550 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1b560 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1b570 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b580 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1b590 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1b5a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1b5b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1b5c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1b5d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1b5e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1b5f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1b600 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1b610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b620 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1b630 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1b640 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1b650 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1b660 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1b670 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1b680 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1b690 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
1b6a0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1b6b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1b6c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1b6d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b6e0 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
1b6f0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1b700 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1b710 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
1b720 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1b730 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b740 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1b750 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 69 66  _active = 0;..if
1b760 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
1b770 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1b780 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72  ch_query) {...fr
1b790 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
1b7a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1b7b0 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a  rch_query);..}..
1b7c0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1b7d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1b7e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1b7f0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1b800 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1b810 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b820 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1b830 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1b840 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1b850 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1b860 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1b870 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1b880 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1b890 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1b8a0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1b8b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1b8c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
1b8d0 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  ryptInit)(CK_SES
1b8e0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1b8f0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
1b900 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
1b910 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
1b920 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
1b930 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b940 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1b950 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1b960 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1b970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b980 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1b990 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1b9a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1b9b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1b9c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1b9d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b9e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1b9f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ba00 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1ba10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1ba20 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1ba30 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1ba40 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1ba50 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1ba60 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
1ba70 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f  crypt)(CK_SESSIO
1ba80 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1ba90 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1baa0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
1bab0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
1bac0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
1bad0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
1bae0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44  TR pulEncryptedD
1baf0 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
1bb00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bb10 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1bb20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1bb30 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1bb40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1bb50 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1bb60 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1bb70 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1bb80 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1bb90 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1bba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1bbb0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1bbc0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1bbd0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1bbe0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1bbf0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1bc00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1bc10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1bc20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1bc30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
1bc40 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
1bc50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1bc60 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1bc70 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
1bc80 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
1bc90 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
1bca0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
1bcb0 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
1bcc0 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
1bcd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bce0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1bcf0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1bd00 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1bd10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bd20 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1bd30 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1bd40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1bd50 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1bd60 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1bd70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bd80 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1bd90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1bda0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1bdb0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1bdc0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1bdd0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1bde0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1bdf0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1be00 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1be10 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  EncryptFinal)(CK
1be20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1be30 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1be40 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79  E_PTR pLastEncry
1be50 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
1be60 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e  NG_PTR pulLastEn
1be70 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
1be80 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1be90 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1bea0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1beb0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1bec0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bed0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1bee0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1bef0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1bf00 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1bf10 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1bf20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bf30 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1bf40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1bf50 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1bf60 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1bf70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1bf80 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1bf90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1bfa0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1bfb0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1bfc0 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29  , C_DecryptInit)
1bfd0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1bfe0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1bff0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
1c000 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
1c010 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
1c020 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
1c030 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a  tval;...hKey--;.
1c040 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c050 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1c060 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1c070 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1c080 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c090 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1c0a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1c0b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c0c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1c0d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1c0e0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d  if (pMechanism =
1c0f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1c100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c110 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
1c120 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  sm is NULL.");..
1c130 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1c140 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1c150 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
1c160 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43  ->mechanism != C
1c170 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09  KM_RSA_PKCS) {..
1c180 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c190 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
1c1a0 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
1c1b0 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  sm not specified
1c1c0 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   as CKM_RSA_PKCS
1c1d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c1e0 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41  R_MECHANISM_PARA
1c1f0 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  M_INVALID);..}..
1c200 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1c210 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1c220 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1c230 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1c240 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1c250 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1c260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c270 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1c280 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1c290 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1c2a0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1c2b0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1c2c0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1c2d0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1c2e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1c2f0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1c300 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1c310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c320 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1c330 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1c340 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1c350 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1c360 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1c370 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c380 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1c390 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1c3a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1c3b0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1c3c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c3d0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1c3e0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1c3f0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1c400 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1c410 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1c420 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1c430 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
1c440 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1c450 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1c460 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1c470 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c480 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
1c490 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69  ecrypt already i
1c4a0 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
1c4b0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1c4c0 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
1c4d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
1c4e0 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
1c4f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
1c500 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
1c510 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1c520 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1c530 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1c540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c550 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
1c560 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  le out of range 
1c570 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25  (requested key %
1c580 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65  lu, only %lu ide
1c590 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c  ntities availabl
1c5a0 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e).", (unsigned 
1c5b0 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73  long) hKey, (uns
1c5c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b  igned long) cack
1c5d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1c5e0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1c5f0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
1c600 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c  rn(CKR_KEY_HANDL
1c610 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1c620 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1c630 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
1c640 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  pt_active = 1;..
1c650 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1c660 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
1c670 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  pt_mechanism = p
1c680 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
1c690 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65  nism;..cackey_se
1c6a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1c6b0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61  .decrypt_mech_pa
1c6c0 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d  rm = pMechanism-
1c6d0 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61  >pParameter;..ca
1c6e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1c6f0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1c700 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70  mech_parmlen = p
1c710 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72  Mechanism->ulPar
1c720 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b  ameterLen;..cack
1c730 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1c740 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64  sion].decrypt_id
1c750 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
1c760 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1c770 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
1c780 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  Key];...mutex_re
1c790 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1c7a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1c7b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1c7c0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1c7d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1c7e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c7f0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1c800 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1c810 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1c820 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1c830 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c840 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1c850 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1c860 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1c870 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1c880 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1c890 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f  , C_Decrypt)(CK_
1c8a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1c8b0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1c8c0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
1c8d0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
1c8e0 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
1c8f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
1c900 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
1c910 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a  R pulDataLen) {.
1c920 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65  .CK_ULONG datale
1c930 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65  n_update, datale
1c940 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20  n_final;..CK_RV 
1c950 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a 09 43  decrypt_ret;...C
1c960 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c970 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c980 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1c990 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1c9a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c9b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1c9c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1c9d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1c9e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1c9f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1ca00 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e  (pulDataLen == N
1ca10 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1ca20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ca30 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20  ror. pulDataLen 
1ca40 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1ca50 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1ca60 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64  NTS_BAD);..}...d
1ca70 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20  atalen_update = 
1ca80 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64  *pulDataLen;...d
1ca90 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44  ecrypt_ret = C_D
1caa0 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65  ecryptUpdate(hSe
1cab0 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65  ssion, pEncrypte
1cac0 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74  dData, ulEncrypt
1cad0 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61  edDataLen, pData
1cae0 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  , &datalen_updat
1caf0 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74  e);..if (decrypt
1cb00 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
1cb10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cb20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cb30 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29   DecryptUpdate()
1cb40 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
1cb50 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
1cb60 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1cb70 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
1cb80 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
1cb90 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
1cba0 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20  Data) {...pData 
1cbb0 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  += datalen_updat
1cbc0 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66  e;..}..datalen_f
1cbd0 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c  inal = *pulDataL
1cbe0 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64  en - datalen_upd
1cbf0 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72  ate;...decrypt_r
1cc00 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69  et = C_DecryptFi
1cc10 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  nal(hSession, pD
1cc20 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69  ata, &datalen_fi
1cc30 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79  nal);..if (decry
1cc40 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
1cc50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1cc60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1cc70 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28  .  DecryptFinal(
1cc80 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
1cc90 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
1cca0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1ccb0 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
1ccc0 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
1ccd0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  _ret);..}...*pul
1cce0 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65  DataLen = datale
1ccf0 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c  n_update + datal
1cd00 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b  en_final;...CACK
1cd10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cd20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1cd30 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1cd40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1cd50 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1cd60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1cd70 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
1cd80 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1cd90 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1cda0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
1cdb0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
1cdc0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
1cdd0 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
1cde0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
1cdf0 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
1ce00 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  n) {..static CK_
1ce10 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b  BYTE buf[16384];
1ce20 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  ..ssize_t buflen
1ce30 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
1ce40 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
1ce50 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ROR;..int mutex_
1ce60 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1ce70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1ce80 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1ce90 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1cea0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1ceb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1cec0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1ced0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1cee0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1cef0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1cf00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1cf10 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1cf20 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1cf30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1cf40 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1cf50 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1cf60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1cf70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1cf80 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1cf90 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1cfa0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1cfb0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1cfc0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e  D);..}...if (pEn
1cfd0 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e  cryptedPart == N
1cfe0 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74  ULL && ulEncrypt
1cff0 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  edPartLen == 0) 
1d000 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
1d010 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61  cuit if we are a
1d020 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20  sked to decrypt 
1d030 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
1d040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d050 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1d060 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
1d070 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
1d080 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
1d090 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
1d0a0 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
1d0b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1d0c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d0d0 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79  F("Error. pEncry
1d0e0 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c  ptedPart is NULL
1d0f0 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65  , but ulEncrypte
1d100 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  dPartLen is not 
1d110 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
1d120 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1d130 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45  D);..}...if (ulE
1d140 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
1d150 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1d160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d170 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65  rror. ulEncrypte
1d180 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62  dPartLen is 0, b
1d190 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20  ut pPart is not 
1d1a0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1d1b0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1d1c0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1d1d0 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  pulPartLen == NU
1d1e0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1d1f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d200 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69  or. pulPartLen i
1d210 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1d220 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1d230 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
1d240 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1d250 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1d260 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d270 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1d280 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1d290 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d2a0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1d2b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1d2c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1d2d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1d2e0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1d2f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1d300 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1d310 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1d320 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1d330 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d340 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1d350 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1d360 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1d370 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1d380 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1d390 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1d3a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d3b0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
1d3c0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1d3d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1d3e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1d3f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d400 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
1d410 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
1d420 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1d430 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
1d440 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1d450 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b  }...switch (cack
1d460 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d470 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
1d480 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
1d490 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
1d4a0 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74  .../* Ask card t
1d4b0 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09  o decrypt */....
1d4c0 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
1d4d0 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
1d4e0 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79  key_slots[cackey
1d4f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d500 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 63 61 63  on].slotID], cac
1d510 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1d520 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
1d530 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70  dentity, pEncryp
1d540 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79  tedPart, ulEncry
1d550 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66  ptedPartLen, buf
1d560 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a  , sizeof(buf));.
1d570 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c  ....if (buflen <
1d580 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63   0) {...../* Dec
1d590 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20  ryption failed. 
1d5a0 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  */.....retval = 
1d5b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1d5c0 52 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20  R;....} else if 
1d5d0 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
1d5e0 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c  ) buflen) > *pul
1d5f0 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74  PartLen && pPart
1d600 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
1d610 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61  pted data too la
1d620 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  rge */.....retva
1d630 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
1d640 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65  OO_SMALL;....} e
1d650 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50  lse {.....if (pP
1d660 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63  art) {......memc
1d670 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62  py(pPart, buf, b
1d680 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09  uflen);.....}...
1d690 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d  ...*pulPartLen =
1d6a0 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65   buflen;......re
1d6b0 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09  tval = CKR_OK;..
1d6c0 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
1d6d0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1d6e0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1d6f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1d700 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1d710 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1d720 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d730 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d740 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1d750 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1d760 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1d770 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1d780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1d790 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
1d7a0 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  t) retval);...re
1d7b0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
1d7c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1d7d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
1d7e0 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ryptFinal)(CK_SE
1d7f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1d800 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1d810 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b  TR pLastPart, CK
1d820 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61  _ULONG_PTR pulLa
1d830 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e  stPartLen) {..in
1d840 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1d850 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64  .int terminate_d
1d860 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41  ecrypt = 1;...CA
1d870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d880 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1d890 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1d8a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1d8b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d8c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1d8d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1d8e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1d8f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1d900 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1d910 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1d920 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1d930 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1d940 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1d950 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1d960 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1d970 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d980 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1d990 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1d9a0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1d9b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1d9c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1d9d0 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  (pulLastPartLen 
1d9e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1d9f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1da00 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74  ("Error. pulLast
1da10 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  PartLen is NULL.
1da20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1da30 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1da40 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1da50 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1da60 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1da70 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1da80 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1da90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1daa0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1dab0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1dac0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1dad0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1dae0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1daf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1db00 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
1db10 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1db20 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1db30 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1db40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1db50 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1db60 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1db70 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1db80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1db90 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1dba0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1dbb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
1dbc0 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
1dbd0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1dbe0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1dbf0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1dc00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1dc10 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74  or.  Decrypt not
1dc20 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1dc30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
1dc40 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
1dc50 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75  LIZED);..}...*pu
1dc60 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30  lLastPartLen = 0
1dc70 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72  ;...if (pLastPar
1dc80 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74  t == NULL) {...t
1dc90 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
1dca0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74   = 0;..}...if (t
1dcb0 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
1dcc0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
1dcd0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1dce0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
1dcf0 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
1dd00 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1dd10 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1dd20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1dd30 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1dd40 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1dd50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1dd60 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1dd70 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1dd80 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1dd90 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
1dda0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ddb0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1ddc0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1ddd0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1dde0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1ddf0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1de00 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29  V, C_DigestInit)
1de10 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1de20 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1de30 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
1de40 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43  echanism) {..CAC
1de50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1de60 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1de70 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1de80 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1de90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1dea0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1deb0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1dec0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1ded0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1dee0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1def0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1df00 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1df10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1df20 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1df30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1df40 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1df50 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1df60 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1df70 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1df80 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
1df90 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gest)(CK_SESSION
1dfa0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1dfb0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
1dfc0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
1dfd0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
1dfe0 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
1dff0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
1e000 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
1e010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e020 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1e030 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1e040 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1e050 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e060 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1e070 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1e080 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1e090 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1e0a0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1e0b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1e0c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1e0d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1e0e0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1e0f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e100 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1e110 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1e120 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1e130 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1e140 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
1e150 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
1e160 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1e170 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1e180 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
1e190 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
1e1a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e1b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1e1c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1e1d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1e1e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e1f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1e200 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1e210 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1e220 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1e230 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1e240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e250 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1e260 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1e270 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1e280 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1e290 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1e2a0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1e2b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e2c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1e2d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1e2e0 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f  C_DigestKey)(CK_
1e2f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1e300 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1e310 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
1e320 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1e330 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1e340 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1e350 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1e360 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e370 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1e380 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1e390 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e3a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1e3b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1e3c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e3d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1e3e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1e3f0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1e400 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1e410 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1e420 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1e430 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1e440 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1e450 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1e460 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29  , C_DigestFinal)
1e470 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1e480 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1e490 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
1e4a0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1e4b0 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
1e4c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e4d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1e4e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1e4f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1e500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e510 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1e520 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1e530 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1e540 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1e550 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1e560 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e570 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e580 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e590 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1e5a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1e5b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1e5c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1e5d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1e5e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1e5f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1e600 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45  _SignInit)(CK_SE
1e610 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1e620 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
1e630 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
1e640 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
1e650 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e  NDLE hKey) {..in
1e660 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1e670 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b  ..hKey--;...CACK
1e680 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e690 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1e6a0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1e6b0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1e6c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e6d0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1e6e0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1e6f0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1e700 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1e710 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  ED);..}...if (pM
1e720 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c  echanism == NULL
1e730 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e740 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e750 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20  . pMechanism is 
1e760 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1e770 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1e780 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1e790 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
1e7a0 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41  anism != CKM_RSA
1e7b0 5f 50 4b 43 53 20 26 26 20 70 4d 65 63 68 61 6e  _PKCS && pMechan
1e7c0 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21  ism->mechanism !
1e7d0 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50  = CKM_SHA1_RSA_P
1e7e0 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KCS) {...CACKEY_
1e7f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e800 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d  ror. pMechanism-
1e810 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73  >mechanism not s
1e820 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f  pecified as CKM_
1e830 52 53 41 5f 50 4b 43 53 20 6f 72 20 43 4b 4d 5f  RSA_PKCS or CKM_
1e840 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 22 29 3b  SHA1_RSA_PKCS");
1e850 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d  ....return(CKR_M
1e860 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49  ECHANISM_PARAM_I
1e870 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
1e880 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1e890 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1e8a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1e8b0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1e8c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1e8d0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1e8e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e8f0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1e900 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1e910 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1e920 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1e930 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1e940 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1e950 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1e960 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1e970 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1e980 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1e990 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e9a0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1e9b0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1e9c0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1e9d0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1e9e0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1e9f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1ea00 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1ea10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1ea20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1ea30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ea40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ea50 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1ea60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1ea70 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1ea80 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1ea90 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1eaa0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1eab0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
1eac0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1ead0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1eae0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1eaf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1eb00 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c  "Error.  Sign al
1eb10 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73  ready in progres
1eb20 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  s.");......retur
1eb30 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
1eb40 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
1eb50 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79   (hKey >= cackey
1eb60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1eb70 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
1eb80 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  ount) {...cackey
1eb90 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1eba0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1ebb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ebc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b  RINTF("Error.  K
1ebd0 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ey handle out of
1ebe0 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65   range (requeste
1ebf0 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20  d key %lu, only 
1ec00 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61  %lu identities a
1ec10 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e  vailable).", (un
1ec20 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
1ec30 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
1ec40 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  g) cackey_sessio
1ec50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
1ec60 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
1ec70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45  ...return(CKR_KE
1ec80 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  Y_HANDLE_INVALID
1ec90 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
1eca0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ecb0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
1ecc0 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  1;...cackey_sess
1ecd0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1ece0 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20  ign_mechanism = 
1ecf0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
1ed00 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f  anism;...cackey_
1ed10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1ed20 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d  n].sign_buflen =
1ed30 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65   128;..cackey_se
1ed40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ed50 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
1ed60 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  0;..cackey_sessi
1ed70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1ed80 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  gn_buf = malloc(
1ed90 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73  sizeof(*cackey_s
1eda0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1edb0 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61  ].sign_buf) * ca
1edc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1edd0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
1ede0 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  len);...CACKEY_D
1edf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73  EBUG_PRINTF("Ses
1ee00 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64  sion %lu sign_id
1ee10 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64  entity is %p (id
1ee20 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28  entity #%lu)", (
1ee30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
1ee40 53 65 73 73 69 6f 6e 2c 20 26 63 61 63 6b 65 79  Session, &cackey
1ee50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1ee60 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
1ee70 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20  Key], (unsigned 
1ee80 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61  long) hKey);..ca
1ee90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1eea0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
1eeb0 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
1eec0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1eed0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
1eee0 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ey];...mutex_ret
1eef0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1ef00 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ef10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ef20 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1ef30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ef40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ef50 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1ef60 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ef70 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ef80 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1ef90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1efa0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1efb0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1efc0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1efd0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1efe0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1eff0 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53   C_Sign)(CK_SESS
1f000 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1f010 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1f020 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
1f030 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
1f040 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
1f050 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
1f060 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
1f070 29 20 7b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f  ) {..CK_RV sign_
1f080 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
1f090 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1f0a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1f0b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1f0c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f0d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f0e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1f0f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1f100 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1f110 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1f120 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  .}...sign_ret = 
1f130 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65  C_SignUpdate(hSe
1f140 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c  ssion, pData, ul
1f150 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73  DataLen);..if (s
1f160 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
1f170 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
1f180 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f190 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29  r.  SignUpdate()
1f1a0 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
1f1b0 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
1f1c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1f1d0 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65  sign_ret);....re
1f1e0 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
1f1f0 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  .}...sign_ret = 
1f200 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73  C_SignFinal(hSes
1f210 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65  sion, pSignature
1f220 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
1f230 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65  n);..if (sign_re
1f240 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
1f250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f260 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
1f270 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  gnFinal() return
1f280 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
1f290 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
1f2a0 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
1f2b0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  t);....return(si
1f2c0 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41  gn_ret);..}...CA
1f2d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f2e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f2f0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1f300 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1f310 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1f320 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1f330 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29  V, C_SignUpdate)
1f340 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1f350 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1f360 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
1f370 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
1f380 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
1f390 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1f3a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f3b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1f3c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1f3d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1f3e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f3f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1f400 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1f410 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1f420 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1f430 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1f440 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1f450 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1f460 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1f470 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1f480 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1f490 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f4a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f4b0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1f4c0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1f4d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1f4e0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1f4f0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  ID);..}...if (pP
1f500 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
1f510 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
1f520 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
1f530 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
1f540 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68  ked to sign noth
1f550 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
1f560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f570 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1f580 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
1f590 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
1f5a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f5b0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  OK);..}...if (pP
1f5c0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
1f5d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f5e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61  INTF("Error. pPa
1f5f0 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
1f600 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  ulPartLen is not
1f610 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
1f620 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1f630 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
1f640 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
1f650 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f660 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
1f670 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
1f680 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
1f690 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1f6a0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1f6b0 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
1f6c0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1f6d0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1f6e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1f6f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1f700 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1f710 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f720 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1f730 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1f740 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1f750 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1f760 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1f770 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1f780 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1f790 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f7a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1f7b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f7c0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1f7d0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1f7e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1f7f0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1f800 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1f810 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1f820 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1f830 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
1f840 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1f850 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f860 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1f870 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f880 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
1f890 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1f8a0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
1f8b0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
1f8c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
1f8d0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
1f8e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1f8f0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
1f900 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
1f910 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
1f920 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f  late directly */
1f930 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ....if ((cackey_
1f940 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f950 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
1f960 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63  + ulPartLen) > c
1f970 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1f980 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
1f990 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b  flen) {.....cack
1f9a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1f9b0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
1f9c0 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63  n *= 2;......cac
1f9d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1f9e0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
1f9f0 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79  = realloc(cackey
1fa00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1fa10 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69  on].sign_buf, si
1fa20 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
1fa30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1fa40 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
1fa50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1fa60 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
1fa70 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  n);....}.....mem
1fa80 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
1fa90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1faa0 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f  gn_buf + cackey_
1fab0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1fac0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
1fad0 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65   pPart, ulPartLe
1fae0 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  n);.....cackey_s
1faf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1fb00 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
1fb10 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09  = ulPartLen;....
1fb20 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
1fb30 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
1fb40 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61  :..../* Accumula
1fb50 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68  te into a SHA1 h
1fb60 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ash */....cackey
1fb70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1fb80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1fb90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fba0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1fbb0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1fbc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1fbd0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1fbe0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1fbf0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1fc00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1fc10 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61  PORTED);....brea
1fc20 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
1fc30 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1fc40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1fc50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1fc60 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1fc70 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1fc80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1fc90 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1fca0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1fcb0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1fcc0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1fcd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fce0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1fcf0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1fd00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1fd10 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1fd20 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1fd30 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43  , C_SignFinal)(C
1fd40 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1fd50 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1fd60 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
1fd70 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
1fd80 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
1fd90 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
1fda0 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b  TE sigbuf[1024];
1fdb0 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66  ..ssize_t sigbuf
1fdc0 6c 65 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  len;..CK_RV retv
1fdd0 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
1fde0 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72  _ERROR;..int ter
1fdf0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b  minate_sign = 1;
1fe00 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1fe10 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1fe20 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1fe30 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1fe40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1fe50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fe60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fe70 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1fe80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1fe90 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1fea0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1feb0 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61  }...if (pulSigna
1fec0 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  tureLen == NULL)
1fed0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fee0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fef0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
1ff00 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1ff10 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1ff20 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1ff30 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1ff40 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1ff50 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1ff60 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1ff70 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1ff80 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1ff90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ffa0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1ffb0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1ffc0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1ffd0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1ffe0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1fff0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
20000 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
20010 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
20020 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
20030 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
20040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20050 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
20060 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
20070 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
20080 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
20090 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
200a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
200b0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
200c0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
200d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
200e0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
200f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20100 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
20110 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
20120 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
20130 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
20140 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
20150 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20160 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
20170 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
20180 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
20190 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
201a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
201b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
201c0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
201d0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
201e0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
201f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
20200 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
20210 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20220 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
20230 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
20240 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
20250 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e  Ask card to sign
20260 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45   */....CACKEY_DE
20270 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69  BUG_PRINTF("Aski
20280 6e 67 20 74 6f 20 64 65 63 72 79 70 74 20 66 72  ng to decrypt fr
20290 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70 20 69  om identity %p i
202a0 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20  n session %lu", 
202b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
202c0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
202d0 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e  dentity, (unsign
202e0 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f  ed long) hSessio
202f0 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e  n);....sigbuflen
20300 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
20310 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
20320 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69  ots[cackey_sessi
20330 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
20340 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65  otID], cackey_se
20350 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
20360 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20  .sign_identity, 
20370 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20380 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
20390 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  uf, cackey_sessi
203a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
203b0 67 6e 5f 62 75 66 6c 65 6e 2c 20 73 69 67 62 75  gn_buflen, sigbu
203c0 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66  f, sizeof(sigbuf
203d0 29 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62  ));.....if (sigb
203e0 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
203f0 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c  ./* Signing fail
20400 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  ed. */.....retva
20410 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
20420 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65  ERROR;....} else
20430 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
20440 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29  long) sigbuflen)
20450 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65   > *pulSignature
20460 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72  Len && pSignatur
20470 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e  e) {...../* Sign
20480 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67  ed data too larg
20490 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20  e */.....retval 
204a0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
204b0 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72  _SMALL;......ter
204c0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
204d0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
204e0 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
204f0 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53  = 0;......if (pS
20500 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09  ignature) {.....
20510 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75  .memcpy(pSignatu
20520 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62  re, sigbuf, sigb
20530 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65  uflen);.......te
20540 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31  rminate_sign = 1
20550 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75  ;.....}......*pu
20560 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
20570 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09  sigbuflen;......
20580 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
20590 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
205a0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31  ...case CKM_SHA1
205b0 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
205c0 20 41 63 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f   Accumulate into
205d0 20 61 20 53 48 41 31 20 68 61 73 68 20 2a 2f 0a   a SHA1 hash */.
205e0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
205f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20600 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b  glock);.....CACK
20610 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20620 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
20630 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20640 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
20650 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20660 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72 65  PPORTED);.....re
20670 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
20680 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
20690 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
206a0 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73  .if (terminate_s
206b0 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63  ign) {...if (cac
206c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
206d0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
206e0 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
206f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20700 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a  ion].sign_buf);.
20710 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65  ..}....cackey_se
20720 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
20730 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
20740 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
20750 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
20760 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
20770 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20780 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
20790 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
207a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
207b0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
207c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
207d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
207e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
207f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20800 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
20810 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a  (int) retval);..
20820 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
20830 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
20840 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
20850 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29  SignRecoverInit)
20860 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
20870 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
20880 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
20890 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
208a0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
208b0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
208c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
208d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
208e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
208f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20900 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20910 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20920 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20930 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20940 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20950 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20960 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20970 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
20980 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
20990 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
209a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
209b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
209c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
209d0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
209e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
209f0 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  V, C_SignRecover
20a00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
20a10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
20a20 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
20a30 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
20a40 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
20a50 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
20a60 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67  ULONG_PTR pulSig
20a70 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41  natureLen) {..CA
20a80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20a90 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
20aa0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
20ab0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
20ac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20ad0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20ae0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20af0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20b00 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20b10 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
20b20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20b30 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
20b40 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20b50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
20b60 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20b70 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
20b80 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
20b90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20ba0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20bb0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
20bc0 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45  erifyInit)(CK_SE
20bd0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
20be0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
20bf0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
20c00 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
20c10 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
20c20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20c30 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
20c40 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
20c50 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
20c60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20c70 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20c80 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20c90 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20ca0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20cb0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
20cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20cd0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
20ce0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20cf0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
20d00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20d10 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
20d20 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
20d30 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20d40 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20d50 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
20d60 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f  erify)(CK_SESSIO
20d70 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
20d80 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
20d90 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
20da0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
20db0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
20dc0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67  , CK_ULONG ulSig
20dd0 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41  natureLen) {..CA
20de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20df0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
20e00 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
20e10 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
20e20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20e30 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20e40 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20e50 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20e60 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20e70 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
20e80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20e90 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
20ea0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20eb0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
20ec0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20ed0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
20ee0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
20ef0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20f00 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20f10 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
20f20 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f  erifyUpdate)(CK_
20f30 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
20f40 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
20f50 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
20f60 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
20f70 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
20f80 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
20f90 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
20fa0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
20fb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20fc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
20fd0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
20fe0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20ff0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21000 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21020 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21030 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21040 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
21050 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
21060 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
21070 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
21080 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21090 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
210a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
210b0 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29  , C_VerifyFinal)
210c0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
210d0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
210e0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
210f0 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
21100 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
21110 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21120 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21130 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21140 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21150 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21160 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
21170 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
21180 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21190 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
211a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
211b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
211c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
211d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
211e0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
211f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21200 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
21210 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
21220 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
21230 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
21240 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
21250 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49  C_VerifyRecoverI
21260 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
21270 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
21280 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
21290 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
212a0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
212b0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
212c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
212d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
212e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
212f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21300 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21310 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21320 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21330 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21340 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21350 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21360 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21370 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21380 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21390 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
213a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
213b0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
213c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
213d0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
213e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
213f0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52  CK_RV, C_VerifyR
21400 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49  ecover)(CK_SESSI
21410 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
21420 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
21430 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
21440 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
21450 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
21460 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
21470 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29  _PTR pulDataLen)
21480 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
21490 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
214a0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
214b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
214c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
214d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
214e0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
214f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21500 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
21510 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
21520 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21530 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
21540 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
21550 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
21560 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
21570 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21580 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
21590 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
215a0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
215b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
215c0 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79  V, C_DigestEncry
215d0 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
215e0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
215f0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
21600 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
21610 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
21620 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
21630 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
21640 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
21650 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
21660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21670 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21680 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21690 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
216a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
216b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
216c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
216d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
216e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
216f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
21700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21710 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
21720 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21730 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
21740 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21750 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
21760 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
21770 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21780 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21790 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
217a0 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61  ecryptDigestUpda
217b0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
217c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
217d0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
217e0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
217f0 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
21800 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
21810 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
21820 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
21830 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
21840 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
21850 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
21860 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21870 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21880 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21890 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
218a0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
218b0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
218c0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
218d0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
218e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
218f0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21900 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21910 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
21920 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21930 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
21940 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21950 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
21960 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
21970 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63  CK_RV, C_SignEnc
21980 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
21990 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
219a0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
219b0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
219c0 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
219d0 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
219e0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
219f0 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
21a00 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
21a10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21a20 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21a30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21a40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
21a50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21a60 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21a70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21a80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21a90 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21aa0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
21ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21ac0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21ad0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21ae0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
21af0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21b00 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
21b10 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
21b20 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21b30 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
21b40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
21b50 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70  _DecryptVerifyUp
21b60 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
21b70 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
21b80 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
21b90 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
21ba0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
21bb0 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
21bc0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
21bd0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
21be0 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
21bf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
21c00 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
21c10 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
21c20 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
21c30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21c40 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
21c50 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
21c60 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
21c70 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
21c80 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
21c90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21ca0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
21cb0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21cc0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
21cd0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21ce0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
21cf0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21d00 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
21d10 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21d20 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
21d30 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  ateKey)(CK_SESSI
21d40 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
21d50 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
21d60 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
21d70 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
21d80 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
21d90 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
21da0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
21db0 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41  PTR phKey) {..CA
21dc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21dd0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21de0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21df0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21e00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21e10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
21e20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21e30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21e40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
21e50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
21e60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21e70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
21e80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21e90 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
21ea0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21eb0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
21ec0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
21ed0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21ee0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21ef0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
21f00 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29 28  enerateKeyPair)(
21f10 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
21f20 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
21f30 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
21f40 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52  chanism, CK_ATTR
21f50 49 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69  IBUTE_PTR pPubli
21f60 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b  cKeyTemplate, CK
21f70 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b  _ULONG ulPublicK
21f80 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  eyAttributeCount
21f90 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
21fa0 54 52 20 70 50 72 69 76 61 74 65 4b 65 79 54 65  TR pPrivateKeyTe
21fb0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
21fc0 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74   ulPrivateKeyAtt
21fd0 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
21fe0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
21ff0 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43  R phPublicKey, C
22000 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
22010 50 54 52 20 70 68 50 72 69 76 61 74 65 4b 65 79  PTR phPrivateKey
22020 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
22030 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
22040 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
22050 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
22060 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22070 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22080 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
22090 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
220a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
220b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
220c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
220d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
220e0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
220f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
22100 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
22110 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22120 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
22130 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22140 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
22150 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22160 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43  RV, C_WrapKey)(C
22170 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22180 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
22190 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
221a0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
221b0 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69  T_HANDLE hWrappi
221c0 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  ngKey, CK_OBJECT
221d0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b  _HANDLE hKey, CK
221e0 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70  _BYTE_PTR pWrapp
221f0 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  edKey, CK_ULONG_
22200 50 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65  PTR pulWrappedKe
22210 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  yLen) {..CACKEY_
22220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
22230 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
22240 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22250 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
22260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22270 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
22280 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
22290 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
222a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
222b0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
222c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
222d0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
222e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
222f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
22300 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22310 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
22320 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22330 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
22340 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
22350 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70  (CK_RV, C_Unwrap
22360 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
22370 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
22380 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
22390 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
223a0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
223b0 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43  UnwrappingKey, C
223c0 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70  K_BYTE_PTR pWrap
223d0 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47  pedKey, CK_ULONG
223e0 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e   ulWrappedKeyLen
223f0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
22400 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
22410 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75  _ULONG ulAttribu
22420 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  teCount, CK_OBJE
22430 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
22440 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
22450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22460 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
22470 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
22480 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
22490 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
224a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
224b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
224c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
224d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
224e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
224f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22500 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
22510 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
22520 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
22530 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22540 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
22550 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22560 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
22570 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
22580 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b  CK_RV, C_DeriveK
22590 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
225a0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
225b0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
225c0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
225d0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42  OBJECT_HANDLE hB
225e0 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49  aseKey, CK_ATTRI
225f0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
22600 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41  te, CK_ULONG ulA
22610 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
22620 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
22630 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41  PTR phKey) {..CA
22640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22650 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
22660 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22670 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22680 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22690 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
226a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
226b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
226c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
226d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
226e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
226f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
22700 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22710 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
22720 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22730 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
22740 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
22750 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
22760 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
22770 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
22780 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45  eedRandom)(CK_SE
22790 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
227a0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
227b0 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f  TR pSeed, CK_ULO
227c0 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a  NG ulSeedLen) {.
227d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
227e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
227f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
22800 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
22810 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22820 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
22830 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
22840 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
22850 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
22860 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
22870 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22880 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
22890 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
228a0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
228b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
228c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
228d0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
228e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
228f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
22900 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
22910 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
22920 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
22930 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
22940 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f  _BYTE_PTR pRando
22950 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  mData, CK_ULONG 
22960 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09  ulRandomLen) {..
22970 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22980 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22990 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
229a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
229b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
229c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
229d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
229e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
229f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22a00 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
22a10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22a20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22a30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22a40 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
22a50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22a60 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
22a70 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
22a80 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22a90 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74  ;.}../* Deprecat
22aa0 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43  ed Function */.C
22ab0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
22ac0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
22ad0 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b  nctionStatus)(CK
22ae0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
22af0 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43  hSession) {..CAC
22b00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22b10 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
22b20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22b30 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
22b40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
22b50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43  ARALLEL (%i)", C
22b60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22b70 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74  PARALLEL);...ret
22b80 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
22b90 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
22ba0 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65  ..hSession = hSe
22bb0 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73  ssion; /* Supres
22bc0 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
22bd0 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
22be0 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75  /* Deprecated Fu
22bf0 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46  nction */.CK_DEF
22c00 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22c10 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63  RV, C_CancelFunc
22c20 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tion)(CK_SESSION
22c30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
22c40 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
22c50 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
22c60 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
22c70 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22c80 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
22c90 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20  ON_NOT_PARALLEL 
22ca0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
22cb0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
22cc0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
22cd0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
22ce0 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69  ALLEL);...hSessi
22cf0 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f  on = hSession; /
22d00 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
22d10 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
22d20 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  g */.}..CK_DEFIN
22d30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
22d40 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  , C_GetFunctionL
22d50 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e  ist)(CK_FUNCTION
22d60 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70  _LIST_PTR_PTR pp
22d70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a  FunctionList) {.
22d80 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53  .CK_FUNCTION_LIS
22d90 54 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c  T_PTR pFunctionL
22da0 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ist;...CACKEY_DE
22db0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22dc0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46  ed.");...if (ppF
22dd0 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e  unctionList == N
22de0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
22df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22e00 72 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c  ror. ppFunctionL
22e10 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ist is NULL.");.
22e20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
22e30 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
22e40 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ...pFunctionList
22e50 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
22e60 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29  (*pFunctionList)
22e70 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  );...pFunctionLi
22e80 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f  st->version.majo
22e90 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
22ea0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
22eb0 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  DE) >> 16) & 0xf
22ec0 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  f;..pFunctionLis
22ed0 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  t->version.minor
22ee0 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50   = ((CACKEY_CRYP
22ef0 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
22f00 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  E) >> 8) & 0xff;
22f10 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ...pFunctionList
22f20 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d  ->C_Initialize =
22f30 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09   C_Initialize;..
22f40 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
22f50 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69  _Finalize = C_Fi
22f60 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  nalize;..pFuncti
22f70 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66  onList->C_GetInf
22f80 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09  o = C_GetInfo;..
22f90 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
22fa0 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43  _GetSlotList = C
22fb0 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70  _GetSlotList;..p
22fc0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22fd0 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f  GetSlotInfo = C_
22fe0 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46  GetSlotInfo;..pF
22ff0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
23000 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f  etTokenInfo = C_
23010 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70  GetTokenInfo;..p
23020 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23030 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
23040 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74   = C_WaitForSlot
23050 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f  Event;..pFunctio
23060 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68  nList->C_GetMech
23070 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65  anismList = C_Ge
23080 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a  tMechanismList;.
23090 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
230a0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
230b0 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  fo = C_GetMechan
230c0 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  ismInfo;..pFunct
230d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54  ionList->C_InitT
230e0 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b  oken = C_InitTok
230f0 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  en;..pFunctionLi
23100 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20  st->C_InitPIN = 
23110 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e  C_InitPIN;..pFun
23120 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74  ctionList->C_Set
23130 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a  PIN = C_SetPIN;.
23140 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
23150 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20  C_OpenSession = 
23160 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09  C_OpenSession;..
23170 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23180 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20  _CloseSession = 
23190 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a  C_CloseSession;.
231a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
231b0 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
231c0 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53  ns = C_CloseAllS
231d0 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74  essions;..pFunct
231e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65  ionList->C_GetSe
231f0 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65  ssionInfo = C_Ge
23200 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70  tSessionInfo;..p
23210 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23220 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  GetOperationStat
23230 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69  e = C_GetOperati
23240 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74  onState;..pFunct
23250 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70  ionList->C_SetOp
23260 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43  erationState = C
23270 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _SetOperationSta
23280 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
23290 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f  st->C_Login = C_
232a0 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  Login;..pFunctio
232b0 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20  nList->C_Logout 
232c0 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75  = C_Logout;..pFu
232d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72  nctionList->C_Cr
232e0 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43  eateObject = C_C
232f0 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46  reateObject;..pF
23300 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
23310 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f  opyObject = C_Co
23320 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63  pyObject;..pFunc
23330 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74  tionList->C_Dest
23340 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65  royObject = C_De
23350 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46  stroyObject;..pF
23360 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
23370 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43  etObjectSize = C
23380 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a  _GetObjectSize;.
23390 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
233a0 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
233b0 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69  lue = C_GetAttri
233c0 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e  buteValue;..pFun
233d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74  ctionList->C_Set
233e0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d  AttributeValue =
233f0 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56   C_SetAttributeV
23400 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  alue;..pFunction
23410 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
23420 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64  ctsInit = C_Find
23430 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46  ObjectsInit;..pF
23440 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
23450 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46  indObjects = C_F
23460 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75  indObjects;..pFu
23470 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
23480 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d  ndObjectsFinal =
23490 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69   C_FindObjectsFi
234a0 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
234b0 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e  ist->C_EncryptIn
234c0 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e  it = C_EncryptIn
234d0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
234e0 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20  st->C_Encrypt = 
234f0 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e  C_Encrypt;..pFun
23500 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
23510 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45  ryptUpdate = C_E
23520 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
23530 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23540 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43  EncryptFinal = C
23550 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09  _EncryptFinal;..
23560 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23570 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43  _DecryptInit = C
23580 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70  _DecryptInit;..p
23590 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
235a0 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72  Decrypt = C_Decr
235b0 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ypt;..pFunctionL
235c0 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70  ist->C_DecryptUp
235d0 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74  date = C_Decrypt
235e0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
235f0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
23600 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79  tFinal = C_Decry
23610 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  ptFinal;..pFunct
23620 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
23630 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74  tInit = C_Digest
23640 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
23650 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d  List->C_Digest =
23660 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e   C_Digest;..pFun
23670 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
23680 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69  estUpdate = C_Di
23690 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75  gestUpdate;..pFu
236a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
236b0 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65  gestKey = C_Dige
236c0 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  stKey;..pFunctio
236d0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46  nList->C_DigestF
236e0 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46  inal = C_DigestF
236f0 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
23700 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74  List->C_SignInit
23710 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09   = C_SignInit;..
23720 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23730 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a  _Sign = C_Sign;.
23740 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
23750 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43  C_SignUpdate = C
23760 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46  _SignUpdate;..pF
23770 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
23780 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67  ignFinal = C_Sig
23790 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  nFinal;..pFuncti
237a0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
237b0 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69  coverInit = C_Si
237c0 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09  gnRecoverInit;..
237d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
237e0 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43  _SignRecover = C
237f0 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70  _SignRecover;..p
23800 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23810 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56  VerifyInit = C_V
23820 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e  erifyInit;..pFun
23830 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
23840 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a  ify = C_Verify;.
23850 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
23860 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 20 3d  C_VerifyUpdate =
23870 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b   C_VerifyUpdate;
23880 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
23890 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d  >C_VerifyFinal =
238a0 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a   C_VerifyFinal;.
238b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
238c0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49  C_VerifyRecoverI
238d0 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65  nit = C_VerifyRe
238e0 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e  coverInit;..pFun
238f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
23900 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56  ifyRecover = C_V
23910 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70  erifyRecover;..p
23920 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23930 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
23940 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e  ate = C_DigestEn
23950 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46  cryptUpdate;..pF
23960 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
23970 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61  ecryptDigestUpda
23980 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69  te = C_DecryptDi
23990 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75  gestUpdate;..pFu
239a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
239b0 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 20  gnEncryptUpdate 
239c0 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55  = C_SignEncryptU
239d0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
239e0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
239f0 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43  VerifyUpdate = C
23a00 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70  _DecryptVerifyUp
23a10 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
23a20 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65  List->C_Generate
23a30 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65  Key = C_Generate
23a40 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
23a50 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b  ist->C_GenerateK
23a60 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72  eyPair = C_Gener
23a70 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75  ateKeyPair;..pFu
23a80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72  nctionList->C_Wr
23a90 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65  apKey = C_WrapKe
23aa0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
23ab0 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d  t->C_UnwrapKey =
23ac0 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70   C_UnwrapKey;..p
23ad0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23ae0 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65  DeriveKey = C_De
23af0 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74  riveKey;..pFunct
23b00 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52  ionList->C_SeedR
23b10 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61  andom = C_SeedRa
23b20 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ndom;..pFunction
23b30 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65  List->C_Generate
23b40 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72  Random = C_Gener
23b50 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e  ateRandom;..pFun
23b60 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
23b70 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d  FunctionStatus =
23b80 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74   C_GetFunctionSt
23b90 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  atus;..pFunction
23ba0 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75  List->C_CancelFu
23bb0 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65  nction = C_Cance
23bc0 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e  lFunction;..pFun
23bd0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
23be0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43  FunctionList = C
23bf0 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74  _GetFunctionList
23c00 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c  ;...*ppFunctionL
23c10 69 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c  ist = pFunctionL
23c20 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ist;...CACKEY_DE
23c30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23c40 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
23c50 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
23c60 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
23c70 0a 0a                                            ..