Hex Artifact Content

Artifact e6d26b97df593008cce71e68ff042e24e719c5e3:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 43 53  .#ifdef HAVE_PCS
0040: 43 4c 49 54 45 5f 48 0a 23 20 20 69 6e 63 6c 75  CLITE_H.#  inclu
0050: 64 65 20 3c 70 63 73 63 6c 69 74 65 2e 68 3e 0a  de <pcsclite.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 57 49 4e 53 43 41 52 44 5f 48 0a 23 20  VE_WINSCARD_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 73 63 61   include <winsca
0090: 72 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  rd.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 53 54 44 49 4e 54 5f  def HAVE_STDINT_
00b0: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74  H.#  include <st
00c0: 64 69 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  dint.h>.#endif.#
00d0: 69 66 64 65 66 20 48 41 56 45 5f 49 4e 54 54 59  ifdef HAVE_INTTY
00e0: 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65  PES_H.#  include
00f0: 20 3c 69 6e 74 74 79 70 65 73 2e 68 3e 0a 23 65   <inttypes.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 53 54 44 4c 49 42 5f 48 0a 23 20 20 69 6e 63  _STDLIB_H.#  inc
0120: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0130: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0140: 56 45 5f 55 4e 49 53 54 44 5f 48 0a 23 20 20 69  VE_UNISTD_H.#  i
0150: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0160: 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  >.#endif.#ifdef 
0170: 48 41 56 45 5f 53 54 52 49 4e 47 5f 48 0a 23 20  HAVE_STRING_H.# 
0180: 20 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67   include <string
0190: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
01a0: 66 20 48 41 56 45 5f 50 54 48 52 45 41 44 5f 48  f HAVE_PTHREAD_H
01b0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 74 68  .#  include <pth
01c0: 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  read.h>.#endif.#
01d0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 4d 49 54  ifdef HAVE_LIMIT
01e0: 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  S_H.#  include <
01f0: 6c 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66  limits.h>.#endif
0200: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 5a 4c 49  .#ifdef HAVE_ZLI
0210: 42 5f 48 0a 23 20 20 69 66 64 65 66 20 48 41 56  B_H.#  ifdef HAV
0220: 45 5f 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c  E_LIBZ.#    incl
0230: 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20  ude <zlib.h>.#  
0240: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69  endif.#else.#  i
0250: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23  fdef HAVE_LIBZ.#
0260: 20 20 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c      undef HAVE_L
0270: 49 42 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  IBZ.#  endif.#en
0280: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f  dif..#define CK_
0290: 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b  PTR *.#define CK
02a0: 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
02b0: 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d  (returnType, nam
02c0: 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61  e) returnType na
02d0: 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45  me.#define CK_DE
02e0: 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72  CLARE_FUNCTION(r
02f0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
0300: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65   returnType name
0310: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c  .#define CK_DECL
0320: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49  ARE_FUNCTION_POI
0330: 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c  NTER(returnType,
0340: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0350: 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69  e (* name).#defi
0360: 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46  ne CK_CALLBACK_F
0370: 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79  UNCTION(returnTy
0380: 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e  pe, name) return
0390: 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69  Type (* name).#i
03a0: 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23  fndef NULL_PTR.#
03b0: 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54    define NULL_PT
03c0: 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63  R 0.#endif..#inc
03d0: 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a  lude "pkcs11.h".
03e0: 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78  #include "asn1-x
03f0: 35 30 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20  509.h"..#ifndef 
0400: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0410: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20  VERSION_CODE.#  
0420: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52  define CACKEY_CR
0430: 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
0440: 4f 44 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e  ODE 0x021e00.#en
0450: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41  dif..#ifndef CKA
0460: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
0470: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
0480: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
0490: 54 48 20 30 78 63 65 35 33 36 33 35 38 0a 23 65  TH 0xce536358.#e
04a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
04b0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04c0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
04d0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04e0: 54 48 20 30 78 63 65 35 33 36 33 35 39 0a 23 65  TH 0xce536359.#e
04f0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
0500: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
0510: 49 4e 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b  ING.#  define CK
0520: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
0530: 4e 49 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a  NING 0xce53635a.
0540: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43  #endif.#ifndef C
0550: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
0560: 52 4f 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66  ROTECTION.#  def
0570: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ine CKA_TRUST_EM
0580: 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30  AIL_PROTECTION 0
0590: 78 63 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66  xce53635b.#endif
05a0: 0a 0a 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31  ../* GSC-IS v2.1
05b0: 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a   Definitions */.
05c0: 2f 2a 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a  /** Classes **/.
05d0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c  #define GSCIS_CL
05e0: 41 53 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20  ASS_ISO7816     
05f0: 20 20 20 20 20 20 30 78 30 30 0a 23 64 65 66 69        0x00.#defi
0600: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  ne GSCIS_CLASS_G
0610: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20  LOBAL_PLATFORM  
0620: 20 30 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72   0x80../** Instr
0630: 75 63 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66  uctions **/.#def
0640: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0650: 47 45 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20  GET_RESPONSE    
0660: 20 20 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47    0xC0.#define G
0670: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
0680: 42 49 4e 41 52 59 20 20 20 20 20 20 20 30 78 42  BINARY       0xB
0690: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06a0: 49 4e 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e  INSTR_UPDATE_BIN
06b0: 41 52 59 20 20 20 20 20 30 78 44 36 0a 23 64 65  ARY     0xD6.#de
06c0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
06d0: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
06e0: 20 20 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20     0xA4.#define 
06f0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45  GSCIS_INSTR_EXTE
0700: 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78  RNAL_AUTH     0x
0710: 38 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  82.#define GSCIS
0720: 5f 49 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c  _INSTR_GET_CHALL
0730: 45 4e 47 45 20 20 20 20 20 30 78 38 34 0a 23 64  ENGE     0x84.#d
0740: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0750: 52 5f 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20  R_INTERNAL_AUTH 
0760: 20 20 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65      0x88.#define
0770: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
0780: 49 46 59 20 20 20 20 20 20 20 20 20 20 20 20 30  IFY            0
0790: 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x20.#define GSCI
07a0: 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20  S_INSTR_SIGN    
07b0: 20 20 20 20 20 20 20 20 20 20 30 78 32 41 0a 23            0x2A.#
07c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
07d0: 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20  TR_GET_PROP     
07e0: 20 20 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e       0x56.#defin
07f0: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0800: 54 5f 41 43 52 20 20 20 20 20 20 20 20 20 20 20  T_ACR           
0810: 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43  0x4C.#define GSC
0820: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
0830: 46 46 45 52 20 20 20 20 20 20 20 30 78 35 32 0a  FFER       0x52.
0840: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0850: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20  STR_SIGNDECRYPT 
0860: 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66        0x42..#def
0870: 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f  ine GSCIS_PARAM_
0880: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20  SELECT_APPLET   
0890: 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73    0x04../** Tags
08a0: 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61   **/./*** CCC Ta
08b0: 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  gs ***/.#define 
08c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
08e0: 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  F0.#define GSCIS
08f0: 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20  _TAG_CCC_VER    
0900: 20 20 20 20 20 20 20 20 20 30 78 46 31 0a 23 64           0xF1.#d
0910: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0920: 43 43 47 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCG_VER         
0930: 20 20 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65      0xF2.#define
0940: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
0950: 52 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  RL             0
0960: 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF3.#define GSCI
0970: 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20  S_TAG_PKCS15    
0980: 20 20 20 20 20 20 20 20 20 20 30 78 46 34 0a 23            0xF4.#
0990: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09a0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20  _REG_DATA_MODEL 
09b0: 20 20 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e       0xF5.#defin
09c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
09d0: 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20  TABLE           
09e0: 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF6.#define GSC
09f0: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55  IS_TAG_CARD_APDU
0a00: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 37 0a             0xF7.
0a10: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a20: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20  G_REDIRECTION   
0a30: 20 20 20 20 20 20 30 78 46 41 0a 23 64 65 66 69        0xFA.#defi
0a40: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20  ne GSCIS_TAG_CT 
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53   0xFB.#define GS
0a70: 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20  CIS_TAG_ST      
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 43              0xFC
0a90: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0aa0: 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20  AG_NEXTCCC      
0ab0: 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a         0xFD../**
0ac0: 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32  * General - EF 2
0ad0: 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  200 ***/.#define
0ae0: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45   GSCIS_TAG_FNAME
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0b00: 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x01.#define GSCI
0b10: 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20  S_TAG_MNAME     
0b20: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0a 23            0x02.#
0b30: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b40: 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _LNAME          
0b50: 20 20 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e       0x03.#defin
0b60: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46  e GSCIS_TAG_SUFF
0b70: 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  IX              
0b80: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x04.#define GSC
0b90: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
0ba0: 43 59 20 20 20 20 20 20 20 20 20 30 78 30 35 0a  CY         0x05.
0bb0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0bc0: 47 5f 42 55 52 45 41 55 20 20 20 20 20 20 20 20  G_BUREAU        
0bd0: 20 20 20 20 20 20 30 78 30 36 0a 23 64 65 66 69        0x06.#defi
0be0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0bf0: 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EAU_CODE        
0c00: 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53   0x07.#define GS
0c10: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
0c20: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 30 38  E           0x08
0c30: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c40: 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20  AG_TITLE        
0c50: 20 20 20 20 20 20 20 30 78 30 39 0a 23 64 65 66         0x09.#def
0c60: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ine GSCIS_TAG_BU
0c70: 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20 20 20  ILDING          
0c80: 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47    0x10.#define G
0c90: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
0ca0: 41 44 44 52 31 20 20 20 20 20 20 20 20 30 78 31  ADDR1        0x1
0cb0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
0cc0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32  TAG_OFFICE_ADDR2
0cd0: 20 20 20 20 20 20 20 20 30 78 31 32 0a 23 64 65          0x12.#de
0ce0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0cf0: 46 46 49 43 45 5f 43 49 54 59 20 20 20 20 20 20  FFICE_CITY      
0d00: 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20     0x13.#define 
0d10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d20: 5f 53 54 41 54 45 20 20 20 20 20 20 20 20 30 78  _STATE        0x
0d30: 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  14.#define GSCIS
0d40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20  _TAG_OFFICE_ZIP 
0d50: 20 20 20 20 20 20 20 20 20 30 78 31 35 0a 23 64           0x15.#d
0d60: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0d70: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20  OFFICE_COUNTRY  
0d80: 20 20 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65      0x16.#define
0d90: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0da0: 45 5f 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30  E_PHONE        0
0db0: 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x17.#define GSCI
0dc0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0dd0: 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23  NE_EXT    0x18.#
0de0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0df0: 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20 20 20  _OFFICE_FAX     
0e00: 20 20 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e       0x19.#defin
0e10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e20: 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20  CE_EMAIL        
0e30: 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43  0x1A.#define GSC
0e40: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
0e50: 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31 42 0a  OM         0x1B.
0e60: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0e70: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20  G_NONGOV_AGENCY 
0e80: 20 20 20 20 20 20 30 78 31 43 0a 23 64 65 66 69        0x1C.#defi
0e90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  ne GSCIS_TAG_SSN
0ea0: 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20  _DESIGNATOR     
0eb0: 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20   0x1D../*** PII 
0ec0: 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23  - EF 2100 ***/.#
0ed0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0ee0: 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20 20 20  _SSN            
0ef0: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e       0x20.#defin
0f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20  e GSCIS_TAG_DOB 
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0x21.#define GSC
0f30: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20  IS_TAG_GENDER   
0f40: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 32 0a             0x22.
0f50: 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f  ./*** Login Info
0f60: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30  rmation - EF 400
0f70: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
0f80: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20  SCIS_TAG_USERID 
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34               0x4
0fa0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0fb0: 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20  TAG_DOMAIN      
0fc0: 20 20 20 20 20 20 20 20 30 78 34 31 0a 23 64 65          0x41.#de
0fd0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50  fine GSCIS_TAG_P
0fe0: 41 53 53 57 4f 52 44 20 20 20 20 20 20 20 20 20  ASSWORD         
0ff0: 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61     0x42../*** Ca
1000: 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  rd Information -
1010: 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 5000 ***/.#d
1020: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1030: 49 53 53 55 45 52 49 44 20 20 20 20 20 20 20 20  ISSUERID        
1040: 20 20 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65      0x50.#define
1050: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f   GSCIS_TAG_SERNO
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1070: 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x51.#define GSCI
1080: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
1090: 20 20 20 20 20 20 20 20 20 20 30 78 35 32 0a 23            0x52.#
10a0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10b0: 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 20 20  _EXPIRE_DATE    
10c0: 20 20 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e       0x53.#defin
10d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
10e0: 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20  _TYPE           
10f0: 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x54.#define GSC
1100: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
1110: 43 4f 44 45 20 20 20 20 20 20 20 30 78 35 37 0a  CODE       0x57.
1120: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1130: 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20 20 20  G_CARDID_AID    
1140: 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a        0x58../***
1150: 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e   PKI Information
1160: 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a   - EF 7000 ***/.
1170: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1180: 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 20 20  G_CERTIFICATE   
1190: 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 66 69        0x70.#defi
11a0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  ne GSCIS_TAG_CER
11b0: 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20  T_ISSUE_DATE    
11c0: 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53   0x71.#define GS
11d0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
11e0: 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 37 32  IRE_DATE    0x72
11f0: 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73  ../** Applet IDs
1200: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43   **/.#define GSC
1210: 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20  IS_AID_CCC      
1220: 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 2c             0xA0,
1230: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1240: 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30  1, 0x16, 0xDB, 0
1250: 78 30 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  x00..#ifdef CACK
1260: 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66 64 65  EY_DEBUG.#  ifde
1270: 66 20 48 41 56 45 5f 53 54 44 49 4f 5f 48 0a 23  f HAVE_STDIO_H.#
1280: 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64      include <std
1290: 69 6f 2e 68 3e 0a 23 20 20 65 6e 64 69 66 0a 0a  io.h>.#  endif..
12a0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
12b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
12c0: 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74  ..) { fprintf(st
12d0: 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20  derr, "%s():%i: 
12e0: 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  ", __func__, __L
12f0: 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28  INE__); fprintf(
1300: 73 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72 69  stderr, x); fpri
1310: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
1320: 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43  ); }.#  define C
1330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1340: 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 7b 20  TBUF(f, x, y) { 
1350: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1360: 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65 64 20  MPBUF; unsigned 
1370: 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42 55 46  long idx; TMPBUF
1380: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
1390: 72 20 2a 29 20 28 78 29 3b 20 66 70 72 69 6e 74  r *) (x); fprint
13a0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a  f(stderr, "%s():
13b0: 25 69 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20  %i: %s  (%s/%lu 
13c0: 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63  = {%02x", __func
13d0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c  __, __LINE__, f,
13e0: 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c   #x, (unsigned l
13f0: 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46  ong) (y), TMPBUF
1400: 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d  [0]); for (idx =
1410: 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69   1; idx < (y); i
1420: 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28  dx++) { fprintf(
1430: 73 74 64 65 72 72 2c 20 22 2c 20 25 30 32 78 22  stderr, ", %02x"
1440: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20  , TMPBUF[idx]); 
1450: 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  }; fprintf(stder
1460: 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 7d 0a 23 20  r, "})\n"); }.# 
1470: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
1480: 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b  EBUG_PERROR(x) {
1490: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14a0: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f   "%s():%i: ", __
14b0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
14c0: 29 3b 20 70 65 72 72 6f 72 28 78 29 3b 20 7d 0a  ); perror(x); }.
14d0: 23 20 20 64 65 66 69 6e 65 20 66 72 65 65 28 78  #  define free(x
14e0: 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ) { CACKEY_DEBUG
14f0: 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28 25 70  _PRINTF("FREE(%p
1500: 29 20 28 25 73 29 22 2c 20 78 2c 20 23 78 29 3b  ) (%s)", x, #x);
1510: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1520: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59  tic void *CACKEY
1530: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
1540: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  OC(size_t size, 
1550: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
1560: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
1570: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
1580: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  etval = malloc(s
1590: 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ize);...fprintf(
15a0: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69  stderr, "%s():%i
15b0: 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29  : ", func, line)
15c0: 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
15d0: 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  r, "MALLOC() = %
15e0: 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70  p", retval);..fp
15f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1600: 6e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  n");...return(re
1610: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1620: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
1630: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
1640: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65  (void *ptr, size
1650: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
1660: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
1670: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
1680: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
1690: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69   realloc(ptr, si
16a0: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  ze);...if (retva
16b0: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70  l != ptr) {...fp
16c0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
16d0: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c  s():%i: ", func,
16e0: 20 6c 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e 74   line);...fprint
16f0: 66 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c 4c  f(stderr, "REALL
1700: 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70 74  OC(%p) = %p", pt
1710: 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 70  r, retval);...fp
1720: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1730: 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  n");..}...return
1740: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
1750: 74 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59  tic char *CACKEY
1760: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44  _DEBUG_FUNC_STRD
1770: 55 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  UP(const char *p
1780: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
1790: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
17a0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b  {..char *retval;
17b0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64  ...retval = strd
17c0: 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e  up(ptr);...fprin
17d0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
17e0: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69  :%i: ", func, li
17f0: 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  ne);..fprintf(st
1800: 64 65 72 72 2c 20 22 53 54 52 44 55 50 5f 4d 41  derr, "STRDUP_MA
1810: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
1820: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
1830: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 0a  stderr, "\n");..
1840: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1850: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
1860: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
1870: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
1880: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61  STR(unsigned cha
1890: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68  r tag) {..switch
18a0: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20   (tag) {...case 
18b0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
18c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
18d0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b  IS_TAG_CARDID");
18e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
18f0: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65  G_CCC_VER:....re
1900: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1910: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73  CCC_VER");...cas
1920: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
1930: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
1940: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
1950: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
1960: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
1970: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1980: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09  TAG_CARDURL");..
1990: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
19a0: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72  PKCS15:....retur
19b0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  n("GSCIS_TAG_PKC
19c0: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53  S15");...case GS
19d0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
19e0: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72  _MODEL:....retur
19f0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47  n("GSCIS_TAG_REG
1a00: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09  _DATA_MODEL");..
1a10: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1a20: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65  ACR_TABLE:....re
1a30: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1a40: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63  ACR_TABLE");...c
1a50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
1a60: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75  RD_APDU:....retu
1a70: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
1a80: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73  RD_APDU");...cas
1a90: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  e GSCIS_TAG_REDI
1aa0: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  RECTION:....retu
1ab0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
1ac0: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63  DIRECTION");...c
1ad0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ase GSCIS_TAG_CT
1ae0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1af0: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63  IS_TAG_CT");...c
1b00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ase GSCIS_TAG_ST
1b10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1b20: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63  IS_TAG_ST");...c
1b30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ase GSCIS_TAG_NE
1b40: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e  XTCCC:....return
1b50: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  ("GSCIS_TAG_NEXT
1b60: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53  CCC");...case GS
1b70: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09  CIS_TAG_FNAME:..
1b80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1b90: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_FNAME");...c
1ba0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e  ase GSCIS_TAG_MN
1bb0: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
1bc0: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22  GSCIS_TAG_MNAME"
1bd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1be0: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_LNAME:....re
1bf0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1c00: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  LNAME");...case 
1c10: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
1c20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1c30: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b  IS_TAG_SUFFIX");
1c40: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c50: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09  G_GOVT_AGENCY:..
1c60: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1c70: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22  TAG_GOVT_AGENCY"
1c80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1c90: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72  TAG_BUREAU:....r
1ca0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1cb0: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73  _BUREAU");...cas
1cc0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
1cd0: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  AU_CODE:....retu
1ce0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
1cf0: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63  REAU_CODE");...c
1d00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ase GSCIS_TAG_DE
1d10: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  PT_CODE:....retu
1d20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45  rn("GSCIS_TAG_DE
1d30: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  PT_CODE");...cas
1d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  e GSCIS_TAG_TITL
1d50: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1d60: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b  CIS_TAG_TITLE");
1d70: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d80: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72  G_BUILDING:....r
1d90: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1da0: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63  _BUILDING");...c
1db0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
1dc0: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72  FICE_ADDR1:....r
1dd0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1de0: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b  _OFFICE_ADDR1");
1df0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1e00: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a  G_OFFICE_ADDR2:.
1e10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e20: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
1e30: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  2");...case GSCI
1e40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
1e50: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
1e60: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
1e70: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ITY");...case GS
1e80: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
1e90: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TATE:....return(
1ea0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1eb0: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73  E_STATE");...cas
1ec0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1ed0: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72  CE_ZIP:....retur
1ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
1ef0: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73  ICE_ZIP");...cas
1f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1f10: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72  CE_COUNTRY:....r
1f20: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1f30: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22  _OFFICE_COUNTRY"
1f40: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1f50: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
1f60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1f70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
1f80: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ONE");...case GS
1f90: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
1fa0: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74  HONE_EXT:....ret
1fb0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1fc0: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22  FFICE_PHONE_EXT"
1fd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1fe0: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a  TAG_OFFICE_FAX:.
1ff0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2000: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22  _TAG_OFFICE_FAX"
2010: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2020: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2030: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2040: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
2050: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIL");...case GS
2060: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2070: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OOM:....return("
2080: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2090: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20  _ROOM");...case 
20a0: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
20b0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
20c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f  rn("GSCIS_TAG_NO
20d0: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09  NGOV_AGENCY");..
20e0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
20f0: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a  SSN_DESIGNATOR:.
2100: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2110: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2120: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TOR");...case GS
2130: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09  CIS_TAG_SSN:....
2140: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2150: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20  G_SSN");...case 
2160: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09  GSCIS_TAG_DOB:..
2170: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2180: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73  TAG_DOB");...cas
2190: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  e GSCIS_TAG_GEND
21a0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
21b0: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22  SCIS_TAG_GENDER"
21c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
21d0: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72  TAG_USERID:....r
21e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
21f0: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73  _USERID");...cas
2200: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  e GSCIS_TAG_DOMA
2210: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IN:....return("G
2220: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22  SCIS_TAG_DOMAIN"
2230: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2240: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09  TAG_PASSWORD:...
2250: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2260: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09  AG_PASSWORD");..
2270: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2280: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74  ISSUERID:....ret
2290: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
22a0: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73  SSUERID");...cas
22b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
22c0: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  O:....return("GS
22d0: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b  CIS_TAG_SERNO");
22e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
22f0: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  G_ISSUE_DATE:...
2300: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2310: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  AG_ISSUE_DATE");
2320: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2330: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  G_EXPIRE_DATE:..
2340: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2350: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22  TAG_EXPIRE_DATE"
2360: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2370: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09  TAG_CARD_TYPE:..
2380: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2390: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b  TAG_CARD_TYPE");
23a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
23b0: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a  G_SECURITY_CODE:
23c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
23d0: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
23e0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
23f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
2400: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2410: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
2420: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AID");...case GS
2430: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
2440: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2450: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
2460: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  ICATE");...case 
2470: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
2480: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
2490: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
24a0: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22  CERT_ISSUE_DATE"
24b0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
24c0: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
24d0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
24e0: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
24f0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
2500: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
2510: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
2520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
2530: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
2540: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c  CARDERR_TO_STR(L
2550: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09  ONG retcode) {..
2560: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29  switch (retcode)
2570: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
2580: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65  S_SUCCESS:....re
2590: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55  turn("SCARD_S_SU
25a0: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CCESS");...case 
25b0: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45  SCARD_E_CANCELLE
25c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
25d0: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22  ARD_E_CANCELLED"
25e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
25f0: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a  E_CANT_DISPOSE:.
2600: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2610: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22  _E_CANT_DISPOSE"
2620: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2630: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
2640: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UFFER:....return
2650: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  ("SCARD_E_INSUFF
2660: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b  ICIENT_BUFFER");
2670: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2680: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09  INVALID_ATR:....
2690: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
26a0: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09  INVALID_ATR");..
26b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
26c0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09  VALID_HANDLE:...
26d0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
26e0: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22  _INVALID_HANDLE"
26f0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2700: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
2710: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TER:....return("
2720: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2730: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63  PARAMETER");...c
2740: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
2750: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72  LID_TARGET:....r
2760: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
2770: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b  NVALID_TARGET");
2780: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2790: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09  INVALID_VALUE:..
27a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
27b0: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22  E_INVALID_VALUE"
27c0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
27d0: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09  E_NO_MEMORY:....
27e0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
27f0: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63  NO_MEMORY");...c
2800: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
2810: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  OWN_READER:....r
2820: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
2830: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b  NKNOWN_READER");
2840: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2850: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75  TIMEOUT:....retu
2860: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45  rn("SCARD_E_TIME
2870: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OUT");...case SC
2880: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
2890: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  OLATION:....retu
28a0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52  rn("SCARD_E_SHAR
28b0: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b  ING_VIOLATION");
28c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
28d0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09  NO_SMARTCARD:...
28e0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
28f0: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b  _NO_SMARTCARD");
2900: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2910: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09  UNKNOWN_CARD:...
2920: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2930: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b  _UNKNOWN_CARD");
2940: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2950: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a  PROTO_MISMATCH:.
2960: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2970: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
2980: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  H");...case SCAR
2990: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09  D_E_NOT_READY:..
29a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
29b0: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09  E_NOT_READY");..
29c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59  .case SCARD_E_SY
29d0: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  STEM_CANCELLED:.
29e0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
29f0: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
2a00: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
2a10: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
2a20: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CTED:....return(
2a30: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41  "SCARD_E_NOT_TRA
2a40: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73  NSACTED");...cas
2a50: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
2a60: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  _UNAVAILABLE:...
2a70: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2a80: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
2a90: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  BLE");...case SC
2aa0: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
2ab0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
2ac0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  n("SCARD_W_UNSUP
2ad0: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  PORTED_CARD");..
2ae0: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
2af0: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a  RESPONSIVE_CARD:
2b00: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2b10: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45  D_W_UNRESPONSIVE
2b20: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2b30: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
2b40: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
2b50: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  n("SCARD_W_UNPOW
2b60: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  ERED_CARD");...c
2b70: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45  ase SCARD_W_RESE
2b80: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  T_CARD:....retur
2b90: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54  n("SCARD_W_RESET
2ba0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2bb0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
2bc0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
2bd0: 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44  "SCARD_W_REMOVED
2be0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2bf0: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
2c00: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e  SMALL:....return
2c10: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f  ("SCARD_E_PCI_TO
2c20: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73  O_SMALL");...cas
2c30: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
2c40: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
2c50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2c60: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
2c70: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
2c80: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
2c90: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
2ca0: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  n("SCARD_E_DUPLI
2cb0: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09  CATE_READER");..
2cc0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
2cd0: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a  RD_UNSUPPORTED:.
2ce0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2cf0: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
2d00: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
2d10: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
2d20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2d30: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22  RD_E_NO_SERVICE"
2d40: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2d50: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
2d60: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
2d70: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
2d80: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20  OPPED");...case 
2d90: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44  SCARD_W_INSERTED
2da0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
2db0: 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  ("SCARD_W_INSERT
2dc0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
2dd0: 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50  e SCARD_E_UNSUPP
2de0: 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09  ORTED_FEATURE:..
2df0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2e00: 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45  E_UNSUPPORTED_FE
2e10: 41 54 55 52 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  ATURE");..}...re
2e20: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
2e30: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
2e40: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
2e50: 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
2e60: 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f  O_STR(uint16_t o
2e70: 62 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20  bjid) {..switch 
2e80: 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65  (objid) {...case
2e90: 20 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75   0x2000:....retu
2ea0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
2eb0: 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f  BJID_GENERALINFO
2ec0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30  ");...case 0x210
2ed0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
2ee0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50  CKEY_TLV_OBJID_P
2ef0: 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29  ROPERSONALINFO")
2f00: 3b 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a  ;...case 0x3000:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2f20: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43  EY_TLV_OBJID_ACC
2f30: 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09  ESSCONTROL");...
2f40: 63 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09  case 0x4000:....
2f50: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
2f60: 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29  LV_OBJID_LOGIN")
2f70: 3b 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a  ;...case 0x5000:
2f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2f90: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52  EY_TLV_OBJID_CAR
2fa0: 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20  DINFO");...case 
2fb0: 30 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x6000:....retur
2fc0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2fd0: 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29  JID_BIOMETRICS")
2fe0: 3b 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a  ;...case 0x7000:
2ff0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3000: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47  EY_TLV_OBJID_DIG
3010: 49 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09  ITALSIGCERT");..
3020: 09 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09  .case 0x0200:...
3030: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3040: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
3050: 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30  RSON");...case 0
3060: 78 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e  x0202:....return
3070: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3080: 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22  ID_CAC_BENEFITS"
3090: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33  );...case 0x0203
30a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30b0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
30c0: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22  C_OTHERBENEFITS"
30d0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31  );...case 0x0201
30e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30f0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3100: 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09  C_PERSONNEL");..
3110: 09 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09  .case 0x02FE:...
3120: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3130: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
3140: 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72  ICERT");..}....r
3150: 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29  eturn("UNKNOWN")
3160: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
3170: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
3180: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
3190: 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74  E_TO_STR(uint8_t
31a0: 20 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69   apptype) {..swi
31b0: 74 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a  tch (apptype) {.
31c0: 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09  ..case 0x00:....
31d0: 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a  return("NONE");.
31e0: 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09  ..case 0x01:....
31f0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3200: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29  LV_APP_GENERIC")
3210: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09  ;...case 0x02:..
3220: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3230: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
3240: 09 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09  ..case 0x03:....
3250: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3260: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
3270: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3280: 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SKI");...case 0x
3290: 30 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  04:....return("C
32a0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
32b0: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35  I");...case 0x05
32c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
32d0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45  KEY_TLV_APP_GENE
32e0: 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  RIC | CACKEY_TLV
32f0: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
3300: 73 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75  se 0x06:....retu
3310: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
3320: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f  PP_SKI | CACKEY_
3330: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
3340: 09 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72  .case 0x07:....r
3350: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3360: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3370: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3380: 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  KI | CACKEY_TLV_
3390: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09  APP_PKI");..}...
33a0: 72 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22  return("INVALID"
33b0: 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20  );.}..#  define 
33c0: 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b 45 59  malloc(x) CACKEY
33d0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
33e0: 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  OC(x, __func__, 
33f0: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66  __LINE__).#  def
3400: 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79  ine realloc(x, y
3410: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
3420: 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79  UNC_REALLOC(x, y
3430: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
3440: 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66 20 73  NE__).#  ifdef s
3450: 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64 65 66  trdup.#    undef
3460: 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64 69 66   strdup.#  endif
3470: 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75  .#  define strdu
3480: 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  p(x) CACKEY_DEBU
3490: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 78 2c  G_FUNC_STRDUP(x,
34a0: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
34b0: 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20 64 65  E__).#else.#  de
34c0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
34d0: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f  G_PRINTF(x...) /
34e0: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41  **/.#  define CA
34f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
3500: 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a  BUF(f, x, y) /**
3510: 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  /.#  define CACK
3520: 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28  EY_DEBUG_PERROR(
3530: 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  x) /**/.#  defin
3540: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
3550: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78  UNC_TAG_TO_STR(x
3560: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
3570: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
3580: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
3590: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78  CARDERR_TO_STR(x
35a0: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
35b0: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
35c0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
35d0: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22  BJID_TO_STR(x) "
35e0: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
35f0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
3600: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
3610: 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  YPE_TO_STR(x) "D
3620: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
3630: 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 63 61  endif..struct ca
3640: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
3650: 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ty {..unsigned c
3660: 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a 09  har applet[7];..
3670: 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a 0a  uint16_t file;..
3680: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
3690: 6c 61 62 65 6c 3b 0a 0a 09 73 69 7a 65 5f 74 20  label;...size_t 
36a0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
36b0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
36c0: 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09  *certificate;...
36d0: 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b  ssize_t keysize;
36e0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  .};..struct cack
36f0: 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 73  ey_identity {..s
3700: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
3710: 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
3720: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f  _identity;...CK_
3730: 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69  ATTRIBUTE *attri
3740: 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  butes;..CK_ULONG
3750: 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e   attributes_coun
3760: 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  t;.};..struct ca
3770: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09  ckey_session {..
3780: 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b  int active;...CK
3790: 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
37a0: 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74  ...CK_STATE stat
37b0: 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61  e;..CK_FLAGS fla
37c0: 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  gs;..CK_ULONG ul
37d0: 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b  DeviceError;..CK
37e0: 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
37f0: 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49  cation;..CK_NOTI
3800: 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72  FY Notify;...str
3810: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
3820: 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b  ity *identities;
3830: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3840: 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
3850: 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61  ;...int search_a
3860: 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49  ctive;..CK_ATTRI
3870: 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f  BUTE_PTR search_
3880: 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  query;..CK_ULONG
3890: 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f   search_query_co
38a0: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  unt;..unsigned l
38b0: 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f  ong search_curr_
38c0: 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61  id;...int sign_a
38d0: 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41  ctive;..CK_MECHA
38e0: 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d  NISM_TYPE sign_m
38f0: 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59  echanism;..CK_BY
3900: 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b  TE_PTR sign_buf;
3910: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3920: 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e  sign_buflen;..un
3930: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e  signed long sign
3940: 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63  _bufused;..struc
3950: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
3960: 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  y *sign_identity
3970: 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f  ;...int decrypt_
3980: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48  active;..CK_MECH
3990: 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79  ANISM_TYPE decry
39a0: 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43  pt_mechanism;..C
39b0: 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79  K_VOID_PTR decry
39c0: 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43  pt_mech_parm;..C
39d0: 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f  K_ULONG decrypt_
39e0: 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73  mech_parmlen;..s
39f0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
3a00: 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69  ntity *decrypt_i
3a10: 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72  dentity;.};..str
3a20: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
3a30: 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a  {..int active;..
3a40: 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64  .char *pcsc_read
3a50: 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63  er;...int pcsc_c
3a60: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09  ard_connected;..
3a70: 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63  SCARDHANDLE pcsc
3a80: 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61  _card;...int tra
3a90: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a  nsaction_depth;.
3aa0: 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74  ..int slot_reset
3ab0: 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ;.};..typedef en
3ac0: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56  um {..CACKEY_TLV
3ad0: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30  _APP_GENERIC = 0
3ae0: 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x01,..CACKEY_TLV
3af0: 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30  _APP_SKI     = 0
3b00: 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x02,..CACKEY_TLV
3b10: 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30  _APP_PKI     = 0
3b20: 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76  x04.} cackey_tlv
3b30: 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64  _apptype;..typed
3b40: 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45  ef enum {..CACKE
3b50: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45  Y_TLV_OBJID_GENE
3b60: 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20  RALINFO       = 
3b70: 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x2000,..CACKEY_
3b80: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
3b90: 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78  SONALINFO   = 0x
3ba0: 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  2100,..CACKEY_TL
3bb0: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
3bc0: 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30  NTROL     = 0x30
3bd0: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
3be0: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20  OBJID_LOGIN     
3bf0: 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30          = 0x4000
3c00: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
3c10: 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20  JID_CARDINFO    
3c20: 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a        = 0x5000,.
3c30: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
3c40: 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20  D_BIOMETRICS    
3c50: 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43      = 0x6000,..C
3c60: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3c70: 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20  DIGITALSIGCERT  
3c80: 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43    = 0x7000,..CAC
3c90: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3ca0: 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20  C_PERSON        
3cb0: 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45  = 0x0200,..CACKE
3cc0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3cd0: 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20  BENEFITS      = 
3ce0: 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f  0x0202,..CACKEY_
3cf0: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54  TLV_OBJID_CAC_OT
3d00: 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78  HERBENEFITS = 0x
3d10: 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0203,..CACKEY_TL
3d20: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
3d30: 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32  ONNEL     = 0x02
3d40: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
3d50: 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52  OBJID_CAC_PKICER
3d60: 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45  T       = 0x02FE
3d70: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  .} cackey_tlv_ob
3d80: 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66  jectid;..typedef
3d90: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
3da0: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
3db0: 45 4e 54 20 20 20 20 3d 20 32 2c 0a 09 43 41 43  ENT    = 2,..CAC
3dc0: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
3dd0: 41 42 53 45 4e 54 20 20 20 20 20 3d 20 31 2c 0a  ABSENT     = 1,.
3de0: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  .CACKEY_PCSC_S_O
3df0: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  K              =
3e00: 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   0,..CACKEY_PCSC
3e10: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
3e20: 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59     = -1,..CACKEY
3e30: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20  _PCSC_E_BADPIN  
3e40: 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43          = -2,..C
3e50: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
3e60: 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d  KED          = -
3e70: 33 2c 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b  3,.} cackey_ret;
3e80: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
3e90: 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75  tlv_cardurl {..u
3ea0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20  nsigned char    
3eb0: 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63      rid[5];..cac
3ec0: 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20  key_tlv_apptype 
3ed0: 20 20 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b    apptype;..cack
3ee0: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20  ey_tlv_objectid 
3ef0: 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b   objectid;..cack
3f00: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20  ey_tlv_objectid 
3f10: 20 61 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65   appid;..unsigne
3f20: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 70 69  d char        pi
3f30: 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  nid;.};..struct 
3f40: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
3f50: 79 3b 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  y;.struct cackey
3f60: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75  _tlv_entity {..u
3f70: 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a  int8_t tag;..siz
3f80: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e  e_t length;...un
3f90: 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61  ion {...void *va
3fa0: 6c 75 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61  lue;...struct ca
3fb0: 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c  ckey_tlv_cardurl
3fc0: 20 2a 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b   *value_cardurl;
3fd0: 0a 09 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65  ...uint8_t value
3fe0: 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72  _byte;..};...str
3ff0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
4000: 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b  ntity *_next;.};
4010: 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62  ../* CACKEY Glob
4020: 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74  al Handles */.st
4030: 61 74 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65  atic void *cacke
4040: 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c  y_biglock = NULL
4050: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
4060: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63  cackey_session c
4070: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31  ackey_sessions[1
4080: 32 38 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75  28];.static stru
4090: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63  ct cackey_slot c
40a0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d  ackey_slots[128]
40b0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ;.static int cac
40c0: 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
40d0: 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  = 0;.static int 
40e0: 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69  cackey_biglock_i
40f0: 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e  nit = 0;.CK_C_IN
4100: 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61  ITIALIZE_ARGS ca
4110: 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50  ckey_args;../* P
4120: 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c  CSC Global Handl
4130: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53  es */.static LPS
4140: 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b  CARDCONTEXT cack
4150: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
4160: 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75   NULL;..static u
4170: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63  nsigned long cac
4180: 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76  key_getversion(v
4190: 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75  oid) {..static u
41a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74  nsigned long ret
41b0: 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69  val = 255;..unsi
41c0: 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20  gned long major 
41d0: 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  = 0;..unsigned l
41e0: 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09  ong minor = 0;..
41f0: 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20  char *major_str 
4200: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d  = NULL;..char *m
4210: 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b  inor_str = NULL;
4220: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4230: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
4240: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  );...if (retval 
4250: 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b  != 255) {...CACK
4260: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4270: 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78  "Returning 0x%lx
4280: 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74   (cached).", ret
4290: 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  val);....return(
42a0: 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65  retval);..}...re
42b0: 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65  tval = 0;..#ifde
42c0: 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  f PACKAGE_VERSIO
42d0: 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f  N.        major_
42e0: 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45  str = PACKAGE_VE
42f0: 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f  RSION;..if (majo
4300: 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20  r_str) {..      
4310: 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75    major = strtou
4320: 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69  l(major_str, &mi
4330: 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09  nor_str, 10);...
4340: 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20  .if (minor_str) 
4350: 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72  {....minor = str
4360: 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b  toul(minor_str +
4370: 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09   1, NULL, 10);..
4380: 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d  .}..}...retval =
4390: 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c   (major << 16) |
43a0: 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23   (minor << 8);.#
43b0: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
43c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
43d0: 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72  urning 0x%lx", r
43e0: 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
43f0: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20  (retval);.}../* 
4400: 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75  PC/SC Related Fu
4410: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a  nctions */./*. *
4420: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
4430: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f   void cackey_slo
4440: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
4450: 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  l(void);. *. * A
4460: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
4470: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
4480: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
4490: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
44a0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
44b0: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
44c0: 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e   from all cards.
44d0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
44e0: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  oid cackey_slots
44f0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
4500: 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f  void) {..uint32_
4510: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
4520: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
4530: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28  lled.");...for (
4540: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
4550: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
4560: 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
4570: 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
4580: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
4590: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
45a0: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
45b0: 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b  ected) {....CACK
45c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
45d0: 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  "SCardDisconnect
45e0: 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28  (%lu) called", (
45f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
4600: 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  dx);.....SCardDi
4610: 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f  sconnect(cackey_
4620: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
4630: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
4640: 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09  E_CARD);...}....
4650: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
4660: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
4670: 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61 63  ected = 0;...cac
4680: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
4690: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
46a0: 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63   = 0;....if (cac
46b0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
46c0: 63 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b  ctive) {....CACK
46d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
46e0: 22 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20  "Marking active 
46f0: 73 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e  slot %lu as bein
4700: 67 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67  g reset", (unsig
4710: 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a  ned long) idx);.
4720: 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ..}....cackey_sl
4730: 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65  ots[idx].slot_re
4740: 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41  set = 1;..}...CA
4750: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4760: 46 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a  F("Returning");.
4770: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
4780: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
4790: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
47a0: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
47b0: 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  t(void);. *. * A
47c0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
47d0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
47e0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
47f0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
4800: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
4810: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
4820: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
4830: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
4840: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
4850: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
4860: 6e 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f  nects to the PC/
4870: 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61  SC Connection Ma
4880: 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65  nager and update
4890: 73 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f  s the. *     glo
48a0: 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20  bal handle.. *. 
48b0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
48c0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
48d0: 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  _connect(void) {
48e0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74  ..LONG scard_est
48f0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69  _context_ret;.#i
4900: 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49  fdef HAVE_SCARDI
4910: 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c  SVALIDCONTEXT..L
4920: 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69  ONG scard_isvali
4930: 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09  d_ret;.#endif...
4940: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4950: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
4960: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
4970: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
4980: 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73  ) {...cackey_pcs
4990: 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f  c_handle = mallo
49a0: 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  c(sizeof(*cackey
49b0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a  _pcsc_handle));.
49c0: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
49d0: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
49e0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
49f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
4a00: 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   to malloc() fai
4a10: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
4a20: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
4a30: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
4a40: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
4a50: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
4a60: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
4a70: 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
4a80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
4a90: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
4aa0: 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b  text() called");
4ab0: 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  ...scard_est_con
4ac0: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64  text_ret = SCard
4ad0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
4ae0: 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53  (SCARD_SCOPE_SYS
4af0: 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  TEM, NULL, NULL,
4b00: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
4b10: 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72  dle);...if (scar
4b20: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4b30: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
4b40: 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45  CESS) {....CACKE
4b50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4b60: 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74  Call to SCardEst
4b70: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61  ablishContext fa
4b80: 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25  iled (returned %
4b90: 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e  s/%li), returnin
4ba0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43  g in failure", C
4bb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4bc0: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
4bd0: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
4be0: 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  xt_ret), (long) 
4bf0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
4c00: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65  t_ret);.....free
4c10: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
4c20: 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  dle);....cackey_
4c30: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
4c40: 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  LL;.....cackey_s
4c50: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
4c60: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
4c70: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
4c80: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d  GENERIC);...}..}
4c90: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43  ..#ifdef HAVE_SC
4ca0: 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58  ARDISVALIDCONTEX
4cb0: 54 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  T..CACKEY_DEBUG_
4cc0: 50 52 49 4e 54 46 28 22 53 43 61 72 64 49 73 56  PRINTF("SCardIsV
4cd0: 61 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61  alidContext() ca
4ce0: 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69  lled");..scard_i
4cf0: 73 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61  svalid_ret = SCa
4d00: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
4d10: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
4d20: 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72  ndle);..if (scar
4d30: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d  d_isvalid_ret !=
4d40: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
4d50: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
4d60: 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c  UG_PRINTF("Handl
4d70: 65 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76  e has become inv
4d80: 61 6c 69 64 20 28 53 43 61 72 64 49 73 56 61 6c  alid (SCardIsVal
4d90: 69 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25  idContext = %s/%
4da0: 6c 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72  li), trying to r
4db0: 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c  e-establish...",
4dc0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4dd0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
4de0: 54 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64  TR(scard_isvalid
4df0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
4e00: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29  ard_isvalid_ret)
4e10: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
4e20: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45  G_PRINTF("SCardE
4e30: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
4e40: 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63  ) called");...sc
4e50: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
4e60: 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62  ret = SCardEstab
4e70: 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52  lishContext(SCAR
4e80: 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20  D_SCOPE_SYSTEM, 
4e90: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b  NULL, NULL, cack
4ea0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
4eb0: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74  ...if (scard_est
4ec0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
4ed0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
4ee0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
4ef0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
4f00: 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73  to SCardEstablis
4f10: 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20  hContext failed 
4f20: 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69  (returned %s/%li
4f30: 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  ), returning in 
4f40: 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59  failure", CACKEY
4f50: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
4f60: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
4f70: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4f80: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
4f90: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4fa0: 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b  );.....free(cack
4fb0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
4fc0: 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
4fd0: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  handle = NULL;..
4fe0: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
4ff0: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
5000: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
5010: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5020: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  IC);...}....CACK
5030: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5040: 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e  "Handle has been
5050: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22   re-established"
5060: 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43  );..}.#endif...C
5070: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5080: 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20  TF("Sucessfully 
5090: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f  connected to PC/
50a0: 53 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  SC, returning in
50b0: 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65   success");...re
50c0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
50d0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
50e0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
50f0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5100: 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
5110: 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20  ct(void);. *. * 
5120: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
5130: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
5140: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
5150: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
5160: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
5170: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
5180: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5190: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
51a0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
51b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69  This function di
51c0: 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74  sconnects from t
51d0: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74  he PC/SC Connect
51e0: 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20  ion manager and 
51f0: 75 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74  updates. *     t
5200: 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65  he global handle
5210: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
5220: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
5230: 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
5240: 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20  t(void) {..LONG 
5250: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
5260: 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_ret;...CACKEY_
5270: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
5280: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
5290: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
52a0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  e == NULL) {...r
52b0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
52c0: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63  C_S_OK);..}...sc
52d0: 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f  ard_rel_context_
52e0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61  ret = SCardRelea
52f0: 73 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65  seContext(*cacke
5300: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
5310: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
5320: 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72  c_handle) {...fr
5330: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
5340: 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b  andle);.....cack
5350: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
5360: 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28   NULL;..}...if (
5370: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
5380: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
5390: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65  _SUCCESS) {...re
53a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
53b0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
53c0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
53d0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
53e0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
53f0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
5400: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
5410: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
5420: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
5430: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5440: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
5450: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
5460: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
5470: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
5480: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5490: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
54a0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
54b0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
54c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
54d0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
54e0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
54f0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
5500: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
5510: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  ret cackey_conne
5520: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
5530: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
5540: 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ) {..cackey_ret 
5550: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
5560: 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ;..DWORD protoco
5570: 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63  l;..LONG scard_c
5580: 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  onn_ret;...CACKE
5590: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
55a0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
55b0: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
55c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
55d0: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
55e0: 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69  ecified, returni
55f0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
5600: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
5610: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5620: 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
5630: 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
5640: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
5650: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
5660: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
5670: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
5680: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5690: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
56a0: 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
56b0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
56c0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
56d0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
56e0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
56f0: 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72  ./* Connect to r
5700: 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 64  eader, if needed
5710: 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e   */..if (!slot->
5720: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
5730: 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ted) {...CACKEY_
5740: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
5750: 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 63  ardConnect(%s) c
5760: 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63  alled", slot->pc
5770: 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73 63  sc_reader);...sc
5780: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
5790: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
57a0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
57b0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
57c0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
57d0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
57e0: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74  OTOCOL_T0, &slot
57f0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
5800: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28  otocol);....if (
5810: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21  scard_conn_ret !
5820: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
5830: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
5840: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
5850: 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20  nection to card 
5860: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
5870: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43  g in failure (SC
5880: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25  ardConnect() = %
5890: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
58a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
58b0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
58c0: 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e  _conn_ret), (lon
58d0: 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  g) scard_conn_re
58e0: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
58f0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5900: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c  ERIC);...}....sl
5910: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
5920: 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73  nnected = 1;...s
5930: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
5940: 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a  _depth = 0;..}..
5950: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5960: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
5970: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
5980: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
5990: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
59a0: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
59b0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
59c0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
59d0: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
59e0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
59f0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
5a00: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
5a10: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
5a20: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
5a30: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
5a40: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
5a50: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
5a60: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
5a70: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
5a80: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72  ES. *     The tr
5a90: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  ansaction should
5aa0: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75   be terminated u
5ab0: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64  sing "cackey_end
5ac0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a  _transaction". *
5ad0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
5ae0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
5af0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
5b00: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5b10: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
5b20: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
5b30: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73  onn_ret;..LONG s
5b40: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a  card_trans_ret;.
5b50: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5b60: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
5b70: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ;...cackey_conn_
5b80: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
5b90: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
5ba0: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e  ..if (cackey_con
5bb0: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
5bc0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
5bd0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5be0: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
5bf0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
5c00: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
5c10: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
5c20: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5c30: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
5c40: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
5c50: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth++;...if (slo
5c60: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
5c70: 65 70 74 68 20 3e 20 31 29 20 7b 0a 09 09 43 41  epth > 1) {...CA
5c80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5c90: 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20  F("Already in a 
5ca0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72  transaction, per
5cb0: 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f  forming no actio
5cc0: 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25  n (new depth = %
5cd0: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73  i)", slot->trans
5ce0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a  action_depth);..
5cf0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5d00: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
5d10: 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  .scard_trans_ret
5d20: 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72 61   = SCardBeginTra
5d30: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70  nsaction(slot->p
5d40: 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20 28  csc_card);..if (
5d50: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
5d60: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
5d70: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
5d80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
5d90: 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72 61  ble to begin tra
5da0: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
5db0: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a  ing in error");.
5dc0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5dd0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
5de0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
5df0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65  BUG_PRINTF("Suce
5e00: 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74 72  ssfully began tr
5e10: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f  ansaction on slo
5e20: 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70  t (%s)", slot->p
5e30: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72  csc_reader);...r
5e40: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5e50: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
5e60: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
5e70: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
5e80: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
5e90: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
5ea0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
5eb0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5ec0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
5ed0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
5ee0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
5ef0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
5f00: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5f10: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
5f20: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
5f30: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
5f40: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
5f50: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
5f60: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
5f70: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
5f80: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63 61  ion requires "ca
5f90: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
5fa0: 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63 61  action" to be ca
5fb0: 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a  lled first. *. *
5fc0: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
5fd0: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ret cackey_end_t
5fe0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
5ff0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
6000: 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  lot) {..LONG sca
6010: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09  rd_trans_ret;...
6020: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6030: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
6040: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
6050: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
6060: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
6070: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
6080: 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64  is not connected
6090: 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  , unable to end 
60a0: 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 0a  transaction");..
60b0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
60c0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
60d0: 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
60e0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
60f0: 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  h == 0) {...CACK
6100: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6110: 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74  "Terminating a t
6120: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
6130: 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29  has not begun!")
6140: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
6150: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6160: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
6170: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
6180: 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  --;...if (slot->
6190: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
61a0: 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45  h > 0) {...CACKE
61b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
61c0: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
61d0: 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  ll in progress, 
61e0: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  not terminating 
61f0: 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74  on-card Transact
6200: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
6210: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
6220: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
6230: 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  th);....return(C
6240: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6250: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  ERIC);..}...scar
6260: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
6270: 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  ardEndTransactio
6280: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
6290: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
62a0: 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ARD);..if (scard
62b0: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
62c0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
62d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
62e0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
62f0: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
6300: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
6310: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
6320: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6330: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
6340: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6350: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
6360: 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e   terminated tran
6370: 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20  saction on slot 
6380: 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73  (%s)", slot->pcs
6390: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74  c_reader);...ret
63a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
63b0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44  S_OK);.}../* APD
63c0: 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  U Related Functi
63d0: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
63e0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
63f0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
6400: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
6410: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
6420: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
6430: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
6440: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
6450: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
6460: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
6470: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
6480: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
6490: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
64a0: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
64b0: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
64c0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
64d0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
64e0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
64f0: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
6500: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
6510: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
6520: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
6530: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
6540: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
6550: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20  ned char class. 
6560: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43  *         APDU C
6570: 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53  lass (GSCIS_CLAS
6580: 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43  S_ISO7816 or GSC
6590: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
65a0: 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20  PLATFORM. *     
65b0: 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43      usually), (C
65c0: 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  LA). *. *     un
65d0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
65e0: 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20  ruction. *      
65f0: 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74     APDU Instruct
6600: 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20  ion (INS). *. * 
6610: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
6620: 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20  r p1. *         
6630: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31  APDU Parameter 1
6640: 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20   (P1). *. *     
6650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32  unsigned char p2
6660: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
6670: 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32   Parameter 2 (P2
6680: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
6690: 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20  gned char lc. * 
66a0: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e          APDU Len
66b0: 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28  gth of Content (
66c0: 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Lc) -- this is t
66d0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61  he length of "da
66e0: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70  ta". *         p
66f0: 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64  arameter.  If "d
6700: 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65  ata" is specifie
6710: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
6720: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20  parameter will. 
6730: 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e  *         be ign
6740: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
6750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
6760: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50  ata. *         P
6770: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
6780: 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68   to send.  It sh
6790: 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74  ould be "Lc" byt
67a0: 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20  es long.  If. * 
67b0: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
67c0: 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20  d as NULL, "Lc" 
67d0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74  will not be sent
67e0: 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65  , and this buffe
67f0: 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20  r will be. *    
6800: 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a       ignored.. *
6810: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
6820: 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20   char le. *     
6830: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
6840: 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28  of Expectation (
6850: 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Le) -- this is t
6860: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
6870: 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65  . *         expe
6880: 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20  cted reply.  If 
6890: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65  this is specifie
68a0: 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77  d as 0 then it w
68b0: 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20  ill not. *      
68c0: 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20     be sent.. *. 
68d0: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a  *     uint16_t *
68e0: 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20  respcode. *     
68f0: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65      [OUT] Pointe
6900: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20  r to storage of 
6910: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f  APDU response co
6920: 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a  de.  If this is.
6930: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
6940: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
6950: 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20  e response code 
6960: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
6970: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
6980: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
6990: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
69a0: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
69b0: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
69c0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20   response data. 
69d0: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
69e0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
69f0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
6a00: 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c  sponse data will
6a10: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20   be discarded.  
6a20: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68  If. *         th
6a30: 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22  e "respdata_len"
6a40: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70   parameter is sp
6a50: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
6a60: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20   this buffer. * 
6a70: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74          will not
6a80: 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a   be updated.. *.
6a90: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72   *     size_t *r
6aa0: 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20  espdata_len. *  
6ab0: 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d         [IN, OUT]
6ac0: 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c   Pointer initial
6ad0: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
6ae0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22  he size of the "
6af0: 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20  respdata". *    
6b00: 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65       buffer.  Be
6b10: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
6b20: 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76  the pointed to v
6b30: 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20  alue is updated 
6b40: 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  to the. *       
6b50: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    number of byte
6b60: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
6b70: 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69   buffer.  If thi
6b80: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
6b90: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c  s. *         NUL
6ba0: 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  L, it will not b
6bb0: 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22  e updated, and "
6bc0: 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62  respdata" will b
6bd0: 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e  e ignored causin
6be0: 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  g. *         the
6bf0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74   response data t
6c00: 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  o be discarded..
6c10: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
6c20: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
6c30: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
6c40: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
6c50: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
6c60: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
6c70: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
6c80: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
6c90: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e  unction will con
6ca0: 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53  nect to the PC/S
6cb0: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e  C Connection Man
6cc0: 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20  ager via. *     
6cd0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
6ce0: 65 63 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e  ect() if needed.
6cf0: 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69  . *. *     It wi
6d00: 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68  ll connect to th
6d10: 65 20 63 61 72 64 20 69 6e 20 74 68 65 20 72 65  e card in the re
6d20: 61 64 65 72 20 61 74 74 61 63 68 65 64 20 74 6f  ader attached to
6d30: 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20   the slot. *    
6d40: 20 73 70 65 63 69 66 69 65 64 2e 20 20 49 74 20   specified.  It 
6d50: 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74  will reconnect t
6d60: 6f 20 74 68 65 20 63 61 72 64 20 69 66 20 74 68  o the card if th
6d70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20  e connection. * 
6d80: 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20      goes away.. 
6d90: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
6da0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
6db0: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
6dc0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
6dd0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
6de0: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
6df0: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
6e00: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
6e10: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
6e20: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
6e30: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
6e40: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
6e50: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
6e60: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
6e70: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
6e80: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
6e90: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
6ea0: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61  n) {..uint8_t ma
6eb0: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63  jor_rc, minor_rc
6ec0: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f  ;..size_t bytes_
6ed0: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73  to_copy, tmp_res
6ee0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 44 57 4f 52  pdata_len;..DWOR
6ef0: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f  D protocol;..DWO
6f00: 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63  RD xmit_len, rec
6f10: 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  v_len;..LONG sca
6f20: 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61  rd_xmit_ret, sca
6f30: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09  rd_reconn_ret;..
6f40: 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30  BYTE xmit_buf[10
6f50: 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30  24], recv_buf[10
6f60: 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  24];..int pcsc_c
6f70: 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63  onnect_ret, pcsc
6f80: 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69  _getresp_ret;..i
6f90: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  nt idx;...CACKEY
6fa0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6fb0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
6fc0: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45  !slot) {...CACKE
6fd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6fe0: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65  Invalid slot spe
6ff0: 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65  cified.");....re
7000: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7010: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7020: 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
7030: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
7040: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
7050: 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
7060: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
7070: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
7080: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7090: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
70a0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
70b0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
70c0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
70d0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
70e0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
70f0: 20 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d   Transmit */..xm
7100: 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69  it_len = 0;..xmi
7110: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
7120: 5d 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74  ] = class;..xmit
7130: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
7140: 20 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a   = instruction;.
7150: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
7160: 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69  en++] = p1;..xmi
7170: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
7180: 5d 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74  ] = p2;..if (dat
7190: 61 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b  a) {...xmit_buf[
71a0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63  xmit_len++] = lc
71b0: 3b 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
71c0: 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b  ; idx < lc; idx+
71d0: 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66  +) {....xmit_buf
71e0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64  [xmit_len++] = d
71f0: 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d  ata[idx];...}..}
7200: 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30  ...if (le != 0x0
7210: 30 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b  0) {...xmit_buf[
7220: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65  xmit_len++] = le
7230: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20  ;..}.../* Begin 
7240: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
7250: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
7260: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
7270: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28  on(slot);...if (
7280: 63 6c 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43  class == GSCIS_C
7290: 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20  LASS_ISO7816 && 
72a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47  instruction == G
72b0: 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
72c0: 59 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 20  Y && p1 == 0x00 
72d0: 26 26 20 70 32 20 3d 3d 20 30 78 30 30 29 20 7b  && p2 == 0x00) {
72e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
72f0: 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20  PRINTF("Sending 
7300: 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64  APDU: <<censored
7310: 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  >>");..} else {.
7320: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7330: 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67  RINTBUF("Sending
7340: 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75   APDU:", xmit_bu
7350: 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d  f, xmit_len);..}
7360: 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
7370: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
7380: 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  .scard_xmit_ret 
7390: 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  = SCardTransmit(
73a0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
73b0: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c 20 78   SCARD_PCI_T0, x
73c0: 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65  mit_buf, xmit_le
73d0: 6e 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 31 2c  n, SCARD_PCI_T1,
73e0: 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76   recv_buf, &recv
73f0: 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 73 63 61 72  _len);..if (scar
7400: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43  d_xmit_ret != SC
7410: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
7420: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7430: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
7440: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63  o send APDU to c
7450: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
7460: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c  it() = %s/%lx)",
7470: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
7480: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
7490: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
74a0: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t), (unsigned lo
74b0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
74c0: 65 74 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  et);...CACKEY_DE
74d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b  BUG_PRINTF("Mark
74e0: 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69  ing slot as havi
74f0: 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b  ng been reset");
7500: 0a 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
7510: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
7520: 0a 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65  ...slot->slot_re
7530: 73 65 74 20 3d 20 31 3b 0a 0a 09 09 69 66 20 28  set = 1;....if (
7540: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
7550: 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
7560: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
7570: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7580: 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
7590: 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
75a0: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
75b0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
75c0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
75d0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
75e0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
75f0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7600: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
7610: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
7620: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e  .if (scard_recon
7630: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  n_ret == SCARD_S
7640: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
7650: 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20  /* Re-establish 
7660: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
7670: 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a  it was present *
7680: 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e  /.....if (slot->
7690: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
76a0: 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  h > 0) {......sl
76b0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
76c0: 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61  depth--;......ca
76d0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
76e0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09  action(slot);...
76f0: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
7700: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
7710: 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20  set successful, 
7720: 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29  retransmitting")
7730: 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74  ;.....scard_xmit
7740: 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e  _ret = SCardTran
7750: 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  smit(slot->pcsc_
7760: 63 61 72 64 2c 20 53 43 41 52 44 5f 50 43 49 5f  card, SCARD_PCI_
7770: 54 30 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  T0, xmit_buf, xm
7780: 69 74 5f 6c 65 6e 2c 20 53 43 41 52 44 5f 50 43  it_len, SCARD_PC
7790: 49 5f 54 30 2c 20 72 65 63 76 5f 62 75 66 2c 20  I_T0, recv_buf, 
77a0: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09  &recv_len);.....
77b0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
77c0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
77d0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
77e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
77f0: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66  TF("Retransmit f
7800: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
7810: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65   in failure afte
7820: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  r disconnecting 
7830: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54  the card (SCardT
7840: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69  ransmit = %s/%li
7850: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
7860: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
7870: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
7880: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
7890: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
78a0: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
78b0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
78c0: 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45  card, SCARD_RESE
78d0: 54 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c  T_CARD);......sl
78e0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
78f0: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
7900: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7910: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7920: 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  */......slot->tr
7930: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
7940: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
7950: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
7960: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65  (slot);.......re
7970: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7980: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 09  _E_GENERIC);....
7990: 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  .}....} else {..
79a0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
79b0: 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65  PRINTF("Disconne
79c0: 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09  cting card");...
79d0: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
79e0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
79f0: 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f  rd, SCARD_RESET_
7a00: 43 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d  CARD);.....slot-
7a10: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
7a20: 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f  cted = 0;....../
7a30: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
7a40: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
7a50: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
7a60: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
7a70: 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
7a80: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
7a90: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
7aa0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
7ab0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
7ac0: 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
7ad0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7ae0: 45 52 49 43 29 3b 0a 09 09 09 7d 0a 09 09 7d 20  ERIC);....}...} 
7af0: 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
7b00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
7b10: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72  isconnecting car
7b20: 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  d");.....SCardDi
7b30: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
7b40: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
7b50: 52 45 53 45 54 5f 43 41 52 44 29 3b 0a 09 09 09  RESET_CARD);....
7b60: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
7b70: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
7b80: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7b90: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7ba0: 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  */....slot->tran
7bb0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
7bc0: 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  1;....cackey_end
7bd0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
7be0: 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  t);.....CACKEY_D
7bf0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
7c00: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7c10: 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43  e");....return(C
7c20: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7c30: 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  ERIC);...}..}...
7c40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7c50: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20  NTBUF("Returned 
7c60: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75  Value:", recv_bu
7c70: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  f, recv_len);...
7c80: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32  if (recv_len < 2
7c90: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c  ) {.../* Minimal
7ca0: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68   response length
7cb0: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74   is 2 bytes, ret
7cc0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7cd0: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  e */...CACKEY_DE
7ce0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
7cf0: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  onse too small, 
7d00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
7d10: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d  lure (recv_len =
7d20: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
7d30: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
7d40: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  );..../* End Sma
7d50: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
7d60: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
7d70: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
7d80: 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  lot);....return(
7d90: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7da0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
7db0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74  Determine result
7dc0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f   code */..major_
7dd0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
7de0: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69  cv_len - 2];..mi
7df0: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75  nor_rc = recv_bu
7e00: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b  f[recv_len - 1];
7e10: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20  ..if (respcode) 
7e20: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20  {...*respcode = 
7e30: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20  (major_rc << 8) 
7e40: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a  | minor_rc;..}..
7e50: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61  ./* Adjust messa
7e60: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65  ge buffer */..re
7e70: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f  cv_len -= 2;.../
7e80: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72  * Add bytes to r
7e90: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09  eturn value */..
7ea0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
7eb0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64   = 0;..if (respd
7ec0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f  ata && respdata_
7ed0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73  len) {...tmp_res
7ee0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73  pdata_len = *res
7ef0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79  pdata_len;....by
7f00: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72  tes_to_copy = *r
7f10: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09  espdata_len;....
7f20: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62  if (recv_len < b
7f30: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a  ytes_to_copy) {.
7f40: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
7f50: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d   = recv_len;...}
7f60: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7f70: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67  _PRINTF("Copying
7f80: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68   %lu bytes to th
7f90: 65 20 62 75 66 66 65 72 22 2c 20 28 75 6e 73 69  e buffer", (unsi
7fa0: 67 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73  gned long) bytes
7fb0: 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 09 6d 65  _to_copy);....me
7fc0: 6d 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72  mcpy(respdata, r
7fd0: 65 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74  ecv_buf, bytes_t
7fe0: 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64  o_copy);...respd
7ff0: 61 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  ata += bytes_to_
8000: 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61  copy;....*respda
8010: 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74  ta_len = bytes_t
8020: 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65  o_copy;...tmp_re
8030: 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79  spdata_len -= by
8040: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20  tes_to_copy;..} 
8050: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63  else {...if (rec
8060: 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  v_len != 0) {...
8070: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8080: 49 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61  INTF("Throwing a
8090: 77 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e  way %lu bytes, n
80a0: 6f 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68  owhere to put th
80b0: 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  em!", (unsigned 
80c0: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b  long) recv_len);
80d0: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61  ...}..}...if (ma
80e0: 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20  jor_rc == 0x61) 
80f0: 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74  {.../* We need t
8100: 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b  o READ */...CACK
8110: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8120: 22 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71  "Buffer read req
8130: 75 69 72 65 64 22 29 3b 0a 0a 09 09 70 63 73 63  uired");....pcsc
8140: 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20 63  _getresp_ret = c
8150: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
8160: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
8170: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
8180: 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f  _INSTR_GET_RESPO
8190: 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  NSE, 0x00, 0x00,
81a0: 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f   0, NULL, minor_
81b0: 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 65  rc, respcode, re
81c0: 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 73  spdata, &tmp_res
81d0: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 09 09 69 66  pdata_len);...if
81e0: 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72   (pcsc_getresp_r
81f0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
8200: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
8210: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8220: 28 22 42 75 66 66 65 72 20 72 65 61 64 20 66 61  ("Buffer read fa
8230: 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67  iled!  Returning
8240: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
8250: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
8260: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
8270: 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
8280: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
8290: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
82a0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
82b0: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERIC);...}....if
82c0: 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20   (respdata_len) 
82d0: 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61 5f 6c  {....*respdata_l
82e0: 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61  en += tmp_respda
82f0: 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f  ta_len;...}..../
8300: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
8310: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
8320: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
8330: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
8340: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8350: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
8360: 20 69 6e 20 73 75 63 63 65 73 73 20 28 62 75 66   in success (buf
8370: 66 65 72 20 72 65 61 64 20 63 6f 6d 70 6c 65 74  fer read complet
8380: 65 29 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 43  e)");...return(C
8390: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
83a0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d  ;..}.../* End Sm
83b0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
83c0: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
83d0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
83e0: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f  lot);...if (majo
83f0: 72 5f 72 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a  r_rc == 0x90) {.
8400: 09 09 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a  ../* Success */.
8410: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8420: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
8430: 20 69 6e 20 73 75 63 63 65 73 73 20 28 6d 61 6a   in success (maj
8440: 6f 72 5f 72 63 20 3d 20 30 78 39 30 29 22 29 3b  or_rc = 0x90)");
8450: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8460: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
8470: 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8480: 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 52 65  _PRINTF("APDU Re
8490: 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c  turned an error,
84a0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
84b0: 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72  ilure");...retur
84c0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
84d0: 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a  GENERIC);.}../*.
84e0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
84f0: 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65     ssize_t cacke
8500: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74  y_read_buffer(st
8510: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
8520: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
8530: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
8540: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73  ize_t count, uns
8550: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f  igned char t_or_
8560: 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61  v, size_t initia
8570: 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a  l_offset);. *. *
8580: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
8590: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
85a0: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
85b0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
85c0: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
85d0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
85e0: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20  d char *buffer. 
85f0: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
8600: 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20  Buffer. *. *    
8610: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a   size_t count. *
8620: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
8630: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65  of bytes to atte
8640: 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20  mpt to read. *. 
8650: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
8660: 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20  har t_or_v. *   
8670: 20 20 20 20 20 20 53 65 6c 65 63 74 20 74 68 65        Select the
8680: 20 54 2d 62 75 66 66 65 72 20 28 30 31 29 20 6f   T-buffer (01) o
8690: 72 20 56 2d 62 75 66 66 65 72 20 28 30 32 29 20  r V-buffer (02) 
86a0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a  to read from.  .
86b0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
86c0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a   initial_offset.
86d0: 20 2a 20 20 20 20 20 20 20 20 20 53 70 65 63 69   *         Speci
86e0: 66 79 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  fy the offset to
86f0: 20 62 65 67 69 6e 20 74 68 65 20 72 65 61 64 20   begin the read 
8700: 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45  from. *. *. * RE
8710: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
8720: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
8730: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
8740: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
8750: 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d 31  ally read, or -1
8760: 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a   on error.. *. *
8770: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
8780: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
8790: 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
87a0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75  read_buffer(stru
87b0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
87c0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
87d0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
87e0: 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67  e_t count, unsig
87f0: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c  ned char t_or_v,
8800: 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f   size_t initial_
8810: 6f 66 66 73 65 74 29 20 7b 0a 09 73 69 7a 65 5f  offset) {..size_
8820: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61  t offset = 0, ma
8830: 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f  x_offset, max_co
8840: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  unt;..unsigned c
8850: 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e  har cmd[2];..uin
8860: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
8870: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
8880: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8890: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
88a0: 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20  ...max_offset = 
88b0: 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e  count;..max_coun
88c0: 74 20 3d 20 32 35 32 3b 0a 0a 09 69 66 20 28 74  t = 252;...if (t
88d0: 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74 5f  _or_v != 1 && t_
88e0: 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09 43  or_v != 2) {...C
88f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8900: 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f 72  TF("Invalid T or
8910: 20 56 20 70 61 72 61 6d 65 74 65 72 20 73 70 65   V parameter spe
8920: 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e  cified, returnin
8930: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
8940: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
8950: 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f  }...cmd[0] = t_o
8960: 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29  r_v;...while (1)
8970: 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74 20   {...if (offset 
8980: 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b  >= max_offset) {
8990: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
89a0: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
89b0: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72  too small, retur
89c0: 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f 74  ning what we got
89d0: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b  ...");.....break
89e0: 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d  ;...}....count =
89f0: 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66   max_offset - of
8a00: 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e  fset;...if (coun
8a10: 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b  t > max_count) {
8a20: 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  ....count = max_
8a30: 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d  count;...}....cm
8a40: 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09  d[1] = count;...
8a50: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
8a60: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
8a70: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
8a80: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
8a90: 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44  GSCIS_INSTR_READ
8aa0: 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74 69  _BUFFER, ((initi
8ab0: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
8ac0: 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  et) >> 8) & 0xff
8ad0: 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  , (initial_offse
8ae0: 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30 78  t + offset) & 0x
8af0: 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c  ff, sizeof(cmd),
8b00: 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65 73   cmd, 0x00, &res
8b10: 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b 20  pcode, buffer + 
8b20: 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b  offset, &count);
8b30: 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
8b40: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
8b50: 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72 65  _OK) {....if (re
8b60: 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38 36  spcode == 0x6A86
8b70: 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78 5f  ) {.....if (max_
8b80: 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09  count == 1) {...
8b90: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
8ba0: 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  .....max_count =
8bb0: 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a   max_count / 2;.
8bc0: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
8bd0: 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
8be0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
8bf0: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20  key_send_apdu() 
8c00: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
8c10: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
8c20: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
8c30: 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d  ..}....offset +=
8c40: 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63   count;....if (c
8c50: 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74  ount < max_count
8c60: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8c70: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f 72  BUG_PRINTF("Shor
8c80: 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20  t read -- count 
8c90: 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25  = %i, cmd[1] = %
8ca0: 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c  i", (int) count,
8cb0: 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a   (int) cmd[1]);.
8cc0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
8cd0: 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
8ce0: 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
8cf0: 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
8d00: 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74 20  MAX..if (offset 
8d10: 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
8d20: 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
8d30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66  EBUG_PRINTF("Off
8d40: 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69  set exceeds maxi
8d50: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
8d60: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
8d70: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66   (max = %li, off
8d80: 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  set = %lu)", (lo
8d90: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
8da0: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
8db0: 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a  long) offset);..
8dc0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
8dd0: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
8de0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8df0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
8e00: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
8e10: 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28  ad %lu bytes", (
8e20: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
8e30: 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e  ffset);...return
8e40: 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (offset);.}../*.
8e50: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
8e60: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
8e70: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
8e80: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
8e90: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
8ea0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
8eb0: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
8ec0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
8ed0: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
8ee0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8ef0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
8f00: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
8f10: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
8f20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
8f30: 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42 75  id. *         Bu
8f40: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
8f50: 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65 6c  Applet ID to sel
8f60: 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  ect. *. *     si
8f70: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20  ze_t aid_len. * 
8f80: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
8f90: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22  f bytes in the "
8fa0: 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44 29  aid" (Applet ID)
8fb0: 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a   parameter. *. *
8fc0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
8fd0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
8fe0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
8ff0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
9000: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9010: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
9020: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
9030: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
9040: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
9050: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
9060: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
9070: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
9080: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9090: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
90a0: 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e  _len) {..int sen
90b0: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
90c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
90d0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
90e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
90f0: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
9100: 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c  et:", aid, aid_l
9110: 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  en);...send_ret 
9120: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
9130: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
9140: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
9150: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
9160: 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45  , GSCIS_PARAM_SE
9170: 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30  LECT_APPLET, 0x0
9180: 43 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c  C, aid_len, aid,
9190: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
91a0: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73  L, NULL);..if (s
91b0: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
91c0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
91d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
91e0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
91f0: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74  open applet, ret
9200: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
9210: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
9220: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9230: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
9240: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9250: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
9260: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
9270: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
9280: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
9290: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
92a0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
92b0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
92c0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
92d0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
92e0: 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20  16_t ef);. *. * 
92f0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
9300: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
9310: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
9320: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
9330: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
9340: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74  . *     uint16_t
9350: 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45   ef. *         E
9360: 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f  lemental File to
9370: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45   select. *. * RE
9380: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
9390: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
93a0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
93b0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
93c0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
93d0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
93e0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
93f0: 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61    This selects a
9400: 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c  n Elementary Fil
9410: 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65  e (EF) under the
9420: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63   currently selec
9430: 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63  ted. *     Dedic
9440: 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20  ated File (DF). 
9450: 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c  *. *     Typical
9460: 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  ly this is calle
9470: 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e  d after selectin
9480: 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70  g the correct Ap
9490: 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20  plet (using. *  
94a0: 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74     cackey_select
94b0: 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20  _applet) for VM 
94c0: 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61  cards. *. */.sta
94d0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
94e0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
94f0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
9500: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
9510: 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69  16_t ef) {..unsi
9520: 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75  gned char fid_bu
9530: 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  f[2];..int send_
9540: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
9550: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
9560: 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  ed.");.../* Open
9570: 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20   the elementary 
9580: 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66  file */..fid_buf
9590: 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20  [0] = (ef >> 8) 
95a0: 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66  & 0xff;..fid_buf
95b0: 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b  [1] = ef & 0xff;
95c0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
95d0: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
95e0: 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20  g file: %04lx", 
95f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
9600: 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  ef);...send_ret 
9610: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
9620: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
9630: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
9640: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
9650: 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69  , 0x02, 0x0C, si
9660: 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66  zeof(fid_buf), f
9670: 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55  id_buf, 0x00, NU
9680: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
9690: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
96a0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
96b0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
96c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
96d0: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  led to open file
96e0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
96f0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9700: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
9710: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
9720: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9730: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
9740: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65  ly selected file
9750: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
9760: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
9770: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
9780: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
9790: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
97a0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
97b0: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20  entity *root);. 
97c0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
97d0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
97e0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
97f0: 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  root. *         
9800: 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20  Root of the TLV 
9810: 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72  list to start fr
9820: 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55  eeing. *. * RETU
9830: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
9840: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
9850: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
9860: 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20  ction frees the 
9870: 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65  TLV linked liste
9880: 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a  d returned from.
9890: 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72   *     "cackey_r
98a0: 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a  ead_tlv". *. */.
98b0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
98c0: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
98d0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
98e0: 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73  tity *root) {..s
98f0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
9900: 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a  _entity *curr, *
9910: 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74  next;...if (root
9920: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
9930: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
9940: 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72  curr = root; cur
9950: 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20  r; curr = next) 
9960: 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d  {...next = curr-
9970: 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63  >_next;....switc
9980: 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a  h (curr->tag) {.
9990: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
99a0: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09  G_ACR_TABLE:....
99b0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
99c0: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
99d0: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29  if (curr->value)
99e0: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
99f0: 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d  r->value);.....}
9a00: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
9a10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
9a20: 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63  RDURL:.....if (c
9a30: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
9a40: 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  rl) {......free(
9a50: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
9a60: 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  url);.....}.....
9a70: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72  break;...}....fr
9a80: 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72  ee(curr);..}...r
9a90: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
9aa0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
9ab0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
9ac0: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
9ad0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
9ae0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
9af0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
9b00: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
9b10: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
9b20: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b  tlv_entity *cack
9b30: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75  ey_read_tlv(stru
9b40: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
9b50: 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20  slot) {..struct 
9b60: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
9b70: 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20  y *curr_entity, 
9b80: 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c  *root = NULL, *l
9b90: 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73  ast = NULL;..uns
9ba0: 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f  igned char tlen_
9bb0: 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66  buf[2], tval_buf
9bc0: 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09  [1024], *tval;..
9bd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c  unsigned char vl
9be0: 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f  en_buf[2], vval_
9bf0: 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c  buf[8192], *vval
9c00: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
9c10: 20 2a 74 6d 70 62 75 66 3b 0a 09 73 73 69 7a 65   *tmpbuf;..ssize
9c20: 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09  _t tlen, vlen;..
9c30: 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74  ssize_t read_ret
9c40: 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74  ;..size_t offset
9c50: 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76  _t = 0, offset_v
9c60: 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20   = 0;..unsigned 
9c70: 63 68 61 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f  char tag;..size_
9c80: 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66 64 65 66  t length;.#ifdef
9c90: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 75 4c 6f 6e   HAVE_LIBZ..uLon
9ca0: 67 66 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69  gf tmpbuflen;..i
9cb0: 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  nt uncompress_re
9cc0: 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  t;.#endif...CACK
9cd0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9ce0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65  "Called.");...re
9cf0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
9d00: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
9d10: 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65  , tlen_buf, size
9d20: 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c  of(tlen_buf), 1,
9d30: 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20   offset_t);..if 
9d40: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a  (read_ret != siz
9d50: 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b  eof(tlen_buf)) {
9d60: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9d70: 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69  PRINTF("Read fai
9d80: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
9d90: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
9da0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
9db0: 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f  ...tlen = (tlen_
9dc0: 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74  buf[1] << 8) | t
9dd0: 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65  len_buf[0];...re
9de0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
9df0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
9e00: 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65  , vlen_buf, size
9e10: 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c  of(vlen_buf), 2,
9e20: 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20   offset_v);..if 
9e30: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a  (read_ret != siz
9e40: 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b  eof(vlen_buf)) {
9e50: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9e60: 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69  PRINTF("Read fai
9e70: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
9e80: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
9e90: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
9ea0: 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f  ...vlen = (vlen_
9eb0: 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76  buf[1] << 8) | v
9ec0: 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41  len_buf[0];...CA
9ed0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9ee0: 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20 3d 20  F("Tag Length = 
9ef0: 25 69 2c 20 56 61 6c 75 65 20 4c 65 6e 67 74 68  %i, Value Length
9f00: 20 3d 20 25 69 22 2c 20 74 6c 65 6e 2c 20 76 6c   = %i", tlen, vl
9f10: 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20  en);...offset_t 
9f20: 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20  += 2;..offset_v 
9f30: 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e  += 2;...if (tlen
9f40: 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62   > sizeof(tval_b
9f50: 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  uf)) {...CACKEY_
9f60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
9f70: 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f 20  g length is too 
9f80: 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e 67  large, returning
9f90: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
9fa0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
9fb0: 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20  .}...if (vlen > 
9fc0: 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75 66 29  sizeof(vval_buf)
9fd0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9fe0: 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c 75 65  UG_PRINTF("Value
9ff0: 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c   length is too l
a000: 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  arge, returning 
a010: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
a020: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
a030: 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63  }...read_ret = c
a040: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
a050: 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66  r(slot, tval_buf
a060: 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65  , tlen, 1, offse
a070: 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_t);..if (read_
a080: 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09  ret != tlen) {..
a090: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a0a0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
a0b0: 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d 62 75  read entire T-bu
a0c0: 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67 20  ffer, returning 
a0d0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
a0e0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
a0f0: 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63  }...read_ret = c
a100: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
a110: 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66  r(slot, vval_buf
a120: 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65  , vlen, 2, offse
a130: 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_v);..if (read_
a140: 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09  ret != vlen) {..
a150: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a160: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
a170: 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d 62 75  read entire V-bu
a180: 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67 20  ffer, returning 
a190: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
a1a0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
a1b0: 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f  }...tval = tval_
a1c0: 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61  buf;..vval = vva
a1d0: 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74  l_buf;..while (t
a1e0: 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65 6e 20  len > 0 && vlen 
a1f0: 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a  > 0) {...tag = *
a200: 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a  tval;...tval++;.
a210: 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20  ..tlen--;....if 
a220: 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66 29 20  (*tval == 0xff) 
a230: 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 28 74  {....length = (t
a240: 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74  val[2] << 8) | t
a250: 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20  val[1];....tval 
a260: 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d  += 3;....tlen -=
a270: 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09   3;...} else {..
a280: 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c  ..length = *tval
a290: 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09  ;....tval++;....
a2a0: 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43  tlen--;...}....C
a2b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a2c0: 54 46 28 22 54 61 67 3a 20 25 73 20 28 25 30 32  TF("Tag: %s (%02
a2d0: 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  x)", CACKEY_DEBU
a2e0: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
a2f0: 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67 6e 65  R(tag), (unsigne
a300: 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09 09 43  d int) tag);...C
a310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a320: 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c 20 76  TBUF("Value:", v
a330: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09  val, length);...
a340: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e  .curr_entity = N
a350: 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20 28 74  ULL;...switch (t
a360: 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20 47 53  ag) {....case GS
a370: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a  CIS_TAG_CARDURL:
a380: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a390: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
a3a0: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b  (*curr_entity));
a3b0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a3c0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 20  ->value_cardurl 
a3d0: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
a3e0: 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  *curr_entity->va
a3f0: 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a  lue_cardurl));..
a400: 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
a410: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
a420: 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c  rdurl->rid, vval
a430: 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72 5f 65  , 5);.....curr_e
a440: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
a450: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20  durl->apptype = 
a460: 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72  vval[5];.....cur
a470: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
a480: 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
a490: 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20  d = (vval[6] << 
a4a0: 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09  8) | vval[7];...
a4b0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
a4c0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
a4d0: 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c  pid = (vval[8] <
a4e0: 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a  < 8) | vval[9];.
a4f0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a500: 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09  ->tag = tag;....
a510: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
a520: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
a530: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
a540: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
a550: 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  BLE:.....curr_en
a560: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
a570: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
a580: 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 20  y));.....tmpbuf 
a590: 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29  = malloc(length)
a5a0: 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  ;......memcpy(tm
a5b0: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
a5c0: 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  th);......curr_e
a5d0: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
a5e0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
a5f0: 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67  y->length = leng
a600: 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  th;.....curr_ent
a610: 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70  ity->value = tmp
a620: 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  buf;.....curr_en
a630: 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55  tity->_next = NU
a640: 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  LL;......break;.
a650: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
a660: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
a670: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
a680: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
a690: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a  curr_entity));..
a6a0: 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
a6b0: 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09 09 09 09  length * 2;.....
a6c0: 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  tmpbuf = malloc(
a6d0: 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 23 69 66  tmpbuflen);..#if
a6e0: 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09  def HAVE_LIBZ...
a6f0: 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  ..uncompress_ret
a700: 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d   = uncompress(tm
a710: 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e  pbuf, &tmpbuflen
a720: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
a730: 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72  .....if (uncompr
a740: 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29  ess_ret != Z_OK)
a750: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
a760: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
a770: 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72 65 73  led to decompres
a780: 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28 29 20  s, uncompress() 
a790: 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d 20 72  returned %i -- r
a7a0: 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69 72 65  esorting to dire
a7b0: 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70  ct copy", uncomp
a7c0: 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09  ress_ret);......
a7d0: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
a7e0: 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79  gth;......memcpy
a7f0: 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c  (tmpbuf, vval, l
a800: 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09  ength);.....}...
a810: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a820: 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d 70  PRINTBUF("Decomp
a830: 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70  ressed to:", tmp
a840: 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b  buf, tmpbuflen);
a850: 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43 4b 45  .#else.....CACKE
a860: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a870: 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53 75 70  Missing ZLIB Sup
a880: 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72 74 69  port, this certi
a890: 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65 6c 79  ficate is likely
a8a0: 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a   useless...");..
a8b0: 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
a8c0: 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63  length;.....memc
a8d0: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
a8e0: 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66   length);.#endif
a8f0: 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ......curr_entit
a900: 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09  y->tag = tag;...
a910: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c  ..curr_entity->l
a920: 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66 6c 65  ength = tmpbufle
a930: 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  n;.....curr_enti
a940: 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62  ty->value = tmpb
a950: 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  uf;.....curr_ent
a960: 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
a970: 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
a980: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
a990: 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63 75 72  _PKCS15:.....cur
a9a0: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
a9b0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
a9c0: 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 63 75  ntity));......cu
a9d0: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
a9e0: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
a9f0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74  ntity->value_byt
aa00: 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09  e = vval[0];....
aa10: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
aa20: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
aa30: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76  .break;...}....v
aa40: 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09  val += length;..
aa50: 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b  .vlen -= length;
aa60: 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65 6e 74  ....if (curr_ent
aa70: 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity != NULL) {..
aa80: 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55  ..if (root == NU
aa90: 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d  LL) {.....root =
aaa0: 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09   curr_entity;...
aab0: 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73 74 20  .}.....if (last 
aac0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c  != NULL) {.....l
aad0: 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72  ast->_next = cur
aae0: 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a  r_entity;....}..
aaf0: 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72 5f 65  ...last = curr_e
ab00: 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  ntity;...}..}...
ab10: 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a  return(root);.}.
ab20: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
ab30: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ab40: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
ab50: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
ab60: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
ab70: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
ab80: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ab90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
aba0: 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
abb0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
abc0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74 61  sc_identity *sta
abd0: 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  rt, size_t count
abe0: 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61 72 74  , int free_start
abf0: 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b  ) {..size_t idx;
ac00: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
ac10: 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64   idx < count; id
ac20: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 61  x++) {...if (sta
ac30: 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt[idx].certific
ac40: 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28 73  ate) {....free(s
ac50: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
ac60: 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  icate);...}..}..
ac70: 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74 29  .if (free_start)
ac80: 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74 29   {...free(start)
ac90: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ;..}...return;.}
aca0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
acb0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
acc0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
acd0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
ace0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
acf0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
ad00: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
ad10: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
ad20: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
ad30: 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65  ntity *cackey_re
ad40: 61 64 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  ad_certs(struct 
ad50: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
ad60: 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  t, struct cackey
ad70: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
ad80: 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65 64 20  certs, unsigned 
ad90: 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09  long *count) {..
ada0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
adb0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72  sc_identity *cur
adc0: 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20 63 61  r_id;..struct ca
add0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
ade0: 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63  *ccc_tlv, *ccc_c
adf0: 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a  urr, *app_tlv, *
ae00: 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67  app_curr;..unsig
ae10: 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61 69 64  ned char ccc_aid
ae20: 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f  [] = {GSCIS_AID_
ae30: 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  CCC};..unsigned 
ae40: 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37 5d  char curr_aid[7]
ae50: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
ae60: 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 61   outidx = 0;..ca
ae70: 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63  ckey_ret transac
ae80: 74 69 6f 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 63  tion_ret;..int c
ae90: 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a  erts_resizable;.
aea0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20 73  .int send_ret, s
aeb0: 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43  elect_ret;...CAC
aec0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
aed0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
aee0: 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  f (count == NULL
aef0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
af00: 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e 74  UG_PRINTF("count
af10: 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e   is NULL, return
af20: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
af30: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
af40: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  );..}...if (cert
af50: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  s != NULL) {...i
af60: 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20  f (*count == 0) 
af70: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
af80: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
af90: 74 65 64 20 77 65 20 72 65 74 75 72 6e 20 30 20  ted we return 0 
afa0: 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d 63  objects, short-c
afb0: 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09 72 65  ircuit");.....re
afc0: 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d  turn(certs);...}
afd0: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61  ..}.../* Begin a
afe0: 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73   SmartCard trans
aff0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73  action */..trans
b000: 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63  action_ret = cac
b010: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
b020: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66  ction(slot);..if
b030: 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65   (transaction_re
b040: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
b050: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
b060: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b070: 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61  Unable begin tra
b080: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
b090: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b0a0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
b0b0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  );..}...if (cert
b0c0: 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
b0d0: 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
b0e0: 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35  zeof(*certs) * 5
b0f0: 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b  );...*count = 5;
b100: 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
b110: 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  le = 1;..} else 
b120: 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  {...certs_resiza
b130: 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  ble = 0;..}.../*
b140: 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20   Select the CCC 
b150: 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f  Applet */..send_
b160: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
b170: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
b180: 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66   ccc_aid, sizeof
b190: 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20  (ccc_aid));..if 
b1a0: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
b1b0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
b1c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b1d0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
b1e0: 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70 70  o select CCC App
b1f0: 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
b200: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
b210: 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61  /* Terminate Sma
b220: 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtCard Transacti
b230: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
b240: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b250: 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  lot);....return(
b260: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52  NULL);..}.../* R
b270: 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c  ead all the appl
b280: 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43  ets from the CCC
b290: 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63 63 5f 74  's TLV */..ccc_t
b2a0: 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  lv = cackey_read
b2b0: 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a  _tlv(slot);.../*
b2c0: 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55 52   Look for CARDUR
b2d0: 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70 6f  Ls that coorespo
b2e0: 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65 74  nd to PKI applet
b2f0: 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63 63 5f 63  s */..for (ccc_c
b300: 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63  urr = ccc_tlv; c
b310: 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75 72  cc_curr; ccc_cur
b320: 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e  r = ccc_curr->_n
b330: 65 78 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ext) {...CACKEY_
b340: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
b350: 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20  und tag: %s ... 
b360: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
b370: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
b380: 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b  ccc_curr->tag));
b390: 0a 0a 09 09 69 66 20 28 63 63 63 5f 63 75 72 72  ....if (ccc_curr
b3a0: 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54  ->tag != GSCIS_T
b3b0: 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09 09  AG_CARDURL) {...
b3c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b3d0: 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
b3e0: 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
b3f0: 20 63 61 72 65 20 61 62 6f 75 74 20 43 41 52 44   care about CARD
b400: 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 63 6f 6e  URLs)");.....con
b410: 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66  tinue;...}....if
b420: 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   ((ccc_curr->val
b430: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
b440: 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54 4c 56  ype & CACKEY_TLV
b450: 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43 41 43  _APP_PKI) != CAC
b460: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29  KEY_TLV_APP_PKI)
b470: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
b480: 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
b490: 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65   skipping it (we
b4a0: 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
b4b0: 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68   PKI applets, th
b4c0: 69 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72  is applet suppor
b4d0: 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43  ts: %s/%02x)", C
b4e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
b4f0: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28  _APPTYPE_TO_STR(
b500: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
b510: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
b520: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ), (unsigned int
b530: 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
b540: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
b550: 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75  pe);.....continu
b560: 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  e;...}....CACKEY
b570: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
b580: 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72 72  "RID:", ccc_curr
b590: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
b5a0: 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63  >rid, sizeof(ccc
b5b0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b5c0: 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 43  durl->rid));...C
b5d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b5e0: 54 46 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25  TF("AppID = %s/%
b5f0: 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45  04lx", CACKEY_DE
b600: 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
b610: 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
b620: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
b630: 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64  ppid), (unsigned
b640: 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d   long) ccc_curr-
b650: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
b660: 61 70 70 69 64 29 3b 0a 09 09 43 41 43 4b 45 59  appid);...CACKEY
b670: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
b680: 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34  bjectID = %s/%04
b690: 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  lx", CACKEY_DEBU
b6a0: 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
b6b0: 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
b6c0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
b6d0: 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65  ectid), (unsigne
b6e0: 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72  d long) ccc_curr
b6f0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
b700: 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 6d  >objectid);....m
b710: 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20  emcpy(curr_aid, 
b720: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
b730: 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69  cardurl->rid, si
b740: 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76  zeof(ccc_curr->v
b750: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
b760: 64 29 29 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b  d));...curr_aid[
b770: 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
b780: 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 72   - 2] = (ccc_cur
b790: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
b7a0: 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26 20  ->appid >> 8) & 
b7b0: 30 78 66 66 3b 0a 09 09 63 75 72 72 5f 61 69 64  0xff;...curr_aid
b7c0: 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
b7d0: 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75 72  ) - 1] = ccc_cur
b7e0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
b7f0: 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b 0a  ->appid & 0xff;.
b800: 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75  .../* Select fou
b810: 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f  nd applet ... */
b820: 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20  ...select_ret = 
b830: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
b840: 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f  plet(slot, curr_
b850: 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  aid, sizeof(curr
b860: 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28 73 65  _aid));...if (se
b870: 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  lect_ret != CACK
b880: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
b890: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b8a0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
b8b0: 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 2c  o select applet,
b8c0: 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73   skipping proces
b8d0: 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a  sing of this obj
b8e0: 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69  ect");.....conti
b8f0: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 2e  nue;...}..../* .
b900: 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20 28 66  .. and object (f
b910: 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c 65 63 74  ile) */...select
b920: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
b930: 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20  lect_file(slot, 
b940: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
b950: 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
b960: 64 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 74  d);...if (select
b970: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
b980: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
b990: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b9a0: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
b9b0: 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70  lect file, skipp
b9c0: 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
b9d0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
b9e0: 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
b9f0: 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63 65 73 73  .}..../* Process
ba00: 20 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56   this file's TLV
ba10: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72   looking for cer
ba20: 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 61  tificates */...a
ba30: 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f  pp_tlv = cackey_
ba40: 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a  read_tlv(slot);.
ba50: 0a 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72 72  ...for (app_curr
ba60: 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f   = app_tlv; app_
ba70: 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20 3d  curr; app_curr =
ba80: 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   app_curr->_next
ba90: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
baa0: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
bab0: 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43 4b  d tag: %s", CACK
bac0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
bad0: 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75 72  G_TO_STR(app_cur
bae0: 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 69 66 20  r->tag));....if 
baf0: 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20 21  (app_curr->tag !
bb00: 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  = GSCIS_TAG_CERT
bb10: 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 43  IFICATE) {.....C
bb20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bb30: 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69  TF("  ... skippi
bb40: 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63  ng it (we only c
bb50: 61 72 65 20 61 62 6f 75 74 20 43 45 52 54 49 46  are about CERTIF
bb60: 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09 09  ICATEs)");......
bb70: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
bb80: 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 65  ...curr_id = &ce
bb90: 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09  rts[outidx];....
bba0: 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d 65  outidx++;.....me
bbb0: 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 61 70  mcpy(curr_id->ap
bbc0: 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 2c 20  plet, curr_aid, 
bbd0: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
bbe0: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 63 75 72  applet));....cur
bbf0: 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20 63 63 63  r_id->file = ccc
bc00: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
bc10: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a  durl->objectid;.
bc20: 09 09 09 63 75 72 72 5f 69 64 2d 3e 6c 61 62 65  ...curr_id->labe
bc30: 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 75 72  l = NULL;....cur
bc40: 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20  r_id->keysize = 
bc50: 2d 31 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  -1;.....CACKEY_D
bc60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c  EBUG_PRINTF("Fil
bc70: 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 61 70  ling curr_id->ap
bc80: 70 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25  plet (%p) with %
bc90: 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72  lu bytes:", curr
bca0: 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e  _id->applet, (un
bcb0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
bcc0: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
bcd0: 6c 65 74 29 29 3b 0a 09 09 09 43 41 43 4b 45 59  let));....CACKEY
bce0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
bcf0: 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d  "VAL:", curr_id-
bd00: 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28  >applet, sizeof(
bd10: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29  curr_id->applet)
bd20: 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  );.....curr_id->
bd30: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
bd40: 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67  = app_curr->leng
bd50: 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  th;.....curr_id-
bd60: 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
bd70: 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63  alloc(curr_id->c
bd80: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
bd90: 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
bda0: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  id->certificate,
bdb0: 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65   app_curr->value
bdc0: 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  , curr_id->certi
bdd0: 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09  ficate_len);....
bde0: 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a  .if (outidx >= *
bdf0: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 69 66 20  count) {.....if 
be00: 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  (certs_resizable
be10: 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20  ) {......*count 
be20: 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65 72 74 73  *= 2;......certs
be30: 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73   = realloc(certs
be40: 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  , sizeof(*certs)
be50: 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09   * (*count));...
be60: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
be70: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09  break;.....}....
be80: 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  }...}....cackey_
be90: 66 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76  free_tlv(app_tlv
bea0: 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74 69 64 78  );....if (outidx
beb0: 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
bec0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
bed0: 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
bee0: 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f  (ccc_tlv);...*co
bef0: 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09  unt = outidx;...
bf00: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
bf10: 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ble) {...certs =
bf20: 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
bf30: 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
bf40: 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a   (*count));..}..
bf50: 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
bf60: 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
bf70: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
bf80: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
bf90: 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63  lot);...return(c
bfa0: 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  erts);.}../*. * 
bfb0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
bfc0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
bfd0: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
bfe0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
bff0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
c000: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
c010: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
c020: 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
c030: 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72  _signdecrypt(str
c040: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
c050: 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61  *slot, struct ca
c060: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
c070: 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
c080: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a  d char *buf, siz
c090: 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69  e_t buflen, unsi
c0a0: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75  gned char *outbu
c0b0: 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66  f, size_t outbuf
c0c0: 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  len) {..unsigned
c0d0: 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a   char *tmpbuf, *
c0e0: 74 6d 70 62 75 66 5f 73 3b 0a 09 75 6e 73 69 67  tmpbuf_s;..unsig
c0f0: 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f 74  ned char bytes_t
c100: 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a 09 63 61 63  o_send, p1;..cac
c110: 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74  key_ret send_ret
c120: 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66  ;..size_t tmpbuf
c130: 6c 65 6e 2c 20 70 61 64 6c 65 6e 3b 0a 09 69 6e  len, padlen;..in
c140: 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  t free_tmpbuf = 
c150: 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41  0;..int le;...CA
c160: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c170: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
c180: 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 32 35 35  if (buflen > 255
c190: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c1a0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
c1b0: 2e 20 20 62 75 66 6c 65 6e 20 69 73 20 67 72 65  .  buflen is gre
c1c0: 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 28 62  ater than 255 (b
c1d0: 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28  uflen = %lu)", (
c1e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
c1f0: 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72  uflen);....retur
c200: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
c210: 6f 75 74 62 75 66 6c 65 6e 20 3e 20 32 35 33 29  outbuflen > 253)
c220: 20 7b 0a 09 09 6c 65 20 3d 20 32 35 33 3b 0a 09   {...le = 253;..
c230: 7d 20 65 6c 73 65 20 7b 0a 09 09 6c 65 20 3d 20  } else {...le = 
c240: 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09  outbuflen;..}...
c250: 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c  if (slot == NULL
c260: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c270: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
c280: 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22  .  slot is NULL"
c290: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c2a0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d  ;..}...if (buf =
c2b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
c2c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c2d0: 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20  "Error.  buf is 
c2e0: 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
c2f0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
c300: 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  outbuf == NULL) 
c310: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c320: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
c330: 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22   outbuf is NULL"
c340: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c350: 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74  ;..}...if (ident
c360: 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
c370: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c380: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
c390: 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29  entity is NULL")
c3a0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
c3b0: 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  ..}...if (identi
c3c0: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
c3d0: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
c3e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c3f0: 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
c400: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
c410: 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  ity is NULL");..
c420: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
c430: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
c440: 69 64 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a  identity Key siz
c450: 65 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  e */..if (identi
c460: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
c470: 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20  y->keysize < 0) 
c480: 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63  {...identity->pc
c490: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
c4a0: 73 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b  size = x509_to_k
c4b0: 65 79 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d  eysize(identity-
c4c0: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
c4d0: 63 65 72 74 69 66 69 63 61 74 65 2c 20 69 64 65  certificate, ide
c4e0: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
c4f0: 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
c500: 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  e_len);..}.../* 
c510: 50 61 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b  Pad message to k
c520: 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28  ey size */..if (
c530: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
c540: 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
c550: 20 3e 20 30 29 20 7b 0a 09 09 69 66 20 28 62 75   > 0) {...if (bu
c560: 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 79  flen != identity
c570: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
c580: 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 69  >keysize) {....i
c590: 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65  f (buflen > (ide
c5a0: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
c5b0: 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20  tity->keysize + 
c5c0: 33 29 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  3)) {.....CACKEY
c5d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
c5e0: 72 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69  rror.  Message i
c5f0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73  s too large to s
c600: 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a  ign/decrypt");..
c610: 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
c620: 09 09 09 7d 0a 0a 09 09 09 74 6d 70 62 75 66 6c  ...}.....tmpbufl
c630: 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  en = identity->p
c640: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
c650: 79 73 69 7a 65 3b 0a 09 09 09 74 6d 70 62 75 66  ysize;....tmpbuf
c660: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
c670: 6c 65 6e 29 3b 0a 09 09 09 66 72 65 65 5f 74 6d  len);....free_tm
c680: 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 70 61  pbuf = 1;.....pa
c690: 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e  dlen = tmpbuflen
c6a0: 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a   - buflen - 3;..
c6b0: 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30  ...tmpbuf[0] = 0
c6c0: 78 30 30 3b 0a 09 09 09 74 6d 70 62 75 66 5b 31  x00;....tmpbuf[1
c6d0: 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 6d 65 6d  ] = 0x01;....mem
c6e0: 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20  set(&tmpbuf[2], 
c6f0: 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09  0xFF, padlen);..
c700: 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 5d  ..tmpbuf[padlen]
c710: 3d 20 30 78 30 30 3b 0a 09 09 09 6d 65 6d 63 70  = 0x00;....memcp
c720: 79 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e  y(&tmpbuf[padlen
c730: 20 2b 20 31 5d 2c 20 62 75 66 2c 20 62 75 66 6c   + 1], buf, bufl
c740: 65 6e 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  en);...} else {.
c750: 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
c760: 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
c770: 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f  buflen;....free_
c780: 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70  tmpbuf = 0;....p
c790: 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09  adlen = 0;...}..
c7a0: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
c7b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c7c0: 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  Unable to determ
c7d0: 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f  ine key size, ho
c7e0: 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65  ping the message
c7f0: 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64   is properly pad
c800: 64 65 64 21 22 29 3b 0a 0a 09 09 74 6d 70 62 75  ded!");....tmpbu
c810: 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75  f = buf;...tmpbu
c820: 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09  flen = buflen;..
c830: 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
c840: 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ;...padlen = 0;.
c850: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72  .}.../* Begin tr
c860: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
c870: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
c880: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
c890: 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63  /* Select correc
c8a0: 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 43 41 43  t applet */..CAC
c8b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c8c0: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
c8d0: 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e  et found at %p .
c8e0: 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ..", identity->p
c8f0: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70  csc_identity->ap
c900: 70 6c 65 74 29 3b 0a 09 63 61 63 6b 65 79 5f 73  plet);..cackey_s
c910: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
c920: 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  t, identity->pcs
c930: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c  c_identity->appl
c940: 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74  et, sizeof(ident
c950: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
c960: 74 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09  ty->applet));...
c970: 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63  /* Select correc
c980: 74 20 66 69 6c 65 20 2a 2f 0a 09 63 61 63 6b 65  t file */..cacke
c990: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c  y_select_file(sl
c9a0: 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
c9b0: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c  sc_identity->fil
c9c0: 65 29 3b 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d  e);...tmpbuf_s =
c9d0: 20 74 6d 70 62 75 66 3b 0a 09 77 68 69 6c 65 20   tmpbuf;..while 
c9e0: 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09  (tmpbuflen) {...
c9f0: 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
ca00: 32 34 35 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  245) {....bytes_
ca10: 74 6f 5f 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09  to_send = 245;..
ca20: 09 09 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 7d  ..p1 = 0x80;...}
ca30: 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73   else {....bytes
ca40: 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75  _to_send = tmpbu
ca50: 66 6c 65 6e 3b 0a 09 09 09 70 31 20 3d 20 30 78  flen;....p1 = 0x
ca60: 30 30 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 5f  00;...}....send_
ca70: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
ca80: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
ca90: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
caa0: 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f  PLATFORM, GSCIS_
cab0: 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50  INSTR_SIGNDECRYP
cac0: 54 2c 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74  T, p1, 0x00, byt
cad0: 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62  es_to_send, tmpb
cae0: 75 66 2c 20 6c 65 2c 20 4e 55 4c 4c 2c 20 6f 75  uf, le, NULL, ou
caf0: 74 62 75 66 2c 20 26 6f 75 74 62 75 66 6c 65 6e  tbuf, &outbuflen
cb00: 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
cb10: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
cb20: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
cb30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
cb40: 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61  "ADPU Sending Fa
cb50: 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e  iled -- returnin
cb60: 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a  g in error.");..
cb70: 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62  ...if (free_tmpb
cb80: 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28 74 6d  uf) {.....if (tm
cb90: 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 09 66  pbuf_s) {......f
cba0: 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09  ree(tmpbuf_s);..
cbb0: 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  ...}....}...../*
cbc0: 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   End transaction
cbd0: 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e   */....cackey_en
cbe0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
cbf0: 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ot);.....return(
cc00: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62  -1);...}....tmpb
cc10: 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73  uf += bytes_to_s
cc20: 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e  end;...tmpbuflen
cc30: 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e   -= bytes_to_sen
cc40: 64 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65  d;..}...if (free
cc50: 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20  _tmpbuf) {...if 
cc60: 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09  (tmpbuf_s) {....
cc70: 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
cc80: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20  ..}..}.../* End 
cc90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
cca0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
ccb0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23  action(slot);..#
ccc0: 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
ccd0: 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
cce0: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
ccf0: 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e  .if (outbuflen >
cd00: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
cd10: 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
cd20: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62  BUG_PRINTF("Outb
cd30: 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61  uflen exceeds ma
cd40: 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
cd50: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
cd60: 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
cd70: 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22  utbuflen = %lu)"
cd80: 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
cd90: 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
cda0: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
cdb0: 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  flen);....return
cdc0: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
cdd0: 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  f.#endif...CACKE
cde0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cdf0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
ce00: 63 65 73 73 2e 22 29 3b 0a 0a 09 72 65 74 75 72  cess.");...retur
ce10: 6e 28 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 7d 0a  n(outbuflen);.}.
ce20: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
ce30: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ce40: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
ce50: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
ce60: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
ce70: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
ce80: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ce90: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
cea0: 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  ret cackey_login
ceb0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
cec0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
ced0: 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75  ned char *pin, u
cee0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e  nsigned long pin
cef0: 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73  _len, int *tries
cf00: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
cf10: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
cf20: 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46  ac_pin[8] = {0xF
cf30: 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
cf40: 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
cf50: 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75   0xFF, 0xFF};..u
cf60: 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65  int16_t response
cf70: 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65  _code;..int trie
cf80: 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e  s_remaining;..in
cf90: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a  t send_ret;.../*
cfa0: 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 77   Indicate that w
cfb0: 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62  e do not know ab
cfc0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69  out how many tri
cfd0: 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67  es are remaining
cfe0: 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72   */..if (tries_r
cff0: 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09  emaining_p) {...
d000: 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  *tries_remaining
d010: 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a  _p = -1;..}.../*
d020: 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43   Apparently, CAC
d030: 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54   PINs are *EXACT
d040: 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67  LY* 8 bytes long
d050: 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46   -- pad with 0xF
d060: 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a  F if too short *
d070: 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e  /..if (pin_len >
d080: 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  = 8) {...memcpy(
d090: 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29  cac_pin, pin, 8)
d0a0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  ;..} else {...me
d0b0: 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
d0c0: 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a  n, pin_len);..}.
d0d0: 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56  ../* Issue PIN V
d0e0: 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72  erify */..send_r
d0f0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
d100: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
d110: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
d120: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
d130: 49 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  IFY, 0x00, 0x00,
d140: 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29   sizeof(cac_pin)
d150: 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c  , cac_pin, 0x00,
d160: 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c   &response_code,
d170: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69   NULL, NULL);..i
d180: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
d190: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
d1a0: 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e   {...if ((respon
d1b0: 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30  se_code & 0x63C0
d1c0: 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09  ) == 0x63C0) {..
d1d0: 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  ..tries_remainin
d1e0: 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f  g = (response_co
d1f0: 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43  de & 0xF);.....C
d200: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d210: 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
d220: 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20  tion failed, %i 
d230: 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22  tries remaining"
d240: 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  , tries_remainin
d250: 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65  g);.....if (trie
d260: 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
d270: 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61  .....*tries_rema
d280: 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f  ining_p = tries_
d290: 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a  remaining;....}.
d2a0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
d2b0: 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
d2c0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73  ;...}....if (res
d2d0: 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78  ponse_code == 0x
d2e0: 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45  6983) {....CACKE
d2f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d300: 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
d310: 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20   failed, device 
d320: 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09  is locked");....
d330: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
d340: 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09  CSC_E_LOCKED);..
d350: 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
d360: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
d370: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
d380: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
d390: 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
d3a0: 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72  succeeded");...r
d3b0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
d3c0: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
d3d0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
d3e0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
d3f0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
d400: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
d410: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
d420: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
d430: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
d440: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
d450: 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
d460: 65 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  ent(struct cacke
d470: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
d480: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
d490: 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49  cc_aid[] = {GSCI
d4a0: 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 69 6e 74  S_AID_CCC};..int
d4b0: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20   send_ret;.../* 
d4c0: 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20 41  Select the CCC A
d4d0: 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72  pplet */..send_r
d4e0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
d4f0: 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ct_applet(slot, 
d500: 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  ccc_aid, sizeof(
d510: 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28  ccc_aid));..if (
d520: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
d530: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
d540: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
d550: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_S_TOKENABSE
d560: 4e 54 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  NT);..}...return
d570: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54  (CACKEY_PCSC_S_T
d580: 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a  OKENPRESENT);.}.
d590: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
d5a0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
d5b0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
d5c0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
d5d0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
d5e0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
d5f0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
d600: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
d610: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
d620: 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73  ntity_to_label(s
d630: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
d640: 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
d650: 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63  tity, unsigned c
d660: 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20  har *label_buf, 
d670: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61  unsigned long la
d680: 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09  bel_buf_len) {..
d690: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65  unsigned long ce
d6a0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
d6b0: 63 68 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e 31  char *label_asn1
d6c0: 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69  ;..void *certifi
d6d0: 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f  cate;..int x509_
d6e0: 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74  read_ret;...cert
d6f0: 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69  ificate = identi
d700: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b  ty->certificate;
d710: 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ..certificate_le
d720: 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  n = identity->ce
d730: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
d740: 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
d750: 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65  _len < 0) {...re
d760: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78  turn(-1);..}...x
d770: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
d780: 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63  509_to_subject(c
d790: 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
d7a0: 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f  ificate_len, (vo
d7b0: 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73  id **) &label_as
d7c0: 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72  n1);..if (x509_r
d7d0: 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
d7e0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
d7f0: 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
d800: 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72  = x509_dn_to_str
d810: 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20  ing(label_asn1, 
d820: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28  x509_read_ret, (
d830: 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75  char *) label_bu
d840: 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e  f, label_buf_len
d850: 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35  , "CN");..if (x5
d860: 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30  09_read_ret <= 0
d870: 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f  ) {...x509_read_
d880: 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f  ret = x509_dn_to
d890: 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73  _string(label_as
d8a0: 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n1, x509_read_re
d8b0: 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65  t, (char *) labe
d8c0: 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66  l_buf, label_buf
d8d0: 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09  _len, NULL);....
d8e0: 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
d8f0: 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74  t <= 0) {....ret
d900: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a  urn(-1);...}..}.
d910: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
d920: 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66  ARANOID.#  ifdef
d930: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
d940: 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  X..if (x509_read
d950: 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53  _ret > _POSIX_SS
d960: 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
d970: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d980: 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ("x509_read_ret 
d990: 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
d9a0: 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
d9b0: 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
d9c0: 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65  x = %li, x509_re
d9d0: 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20  ad_ret = %lu)", 
d9e0: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
d9f0: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
da00: 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65  ed long) x509_re
da10: 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  ad_ret);....retu
da20: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
da30: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74  dif.#endif...ret
da40: 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65  urn(x509_read_re
da50: 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  t);.}../* Return
da60: 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  s 0 on success *
da70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
da80: 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65  key_mutex_create
da90: 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b  (void **mutex) {
daa0: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
dab0: 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
dac0: 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
dad0: 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
dae0: 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
daf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
db00: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
db10: 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
db20: 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
db30: 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
db40: 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
db50: 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
db60: 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  utex = malloc(si
db70: 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75  zeof(*pthread_mu
db80: 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74  tex));...if (!pt
db90: 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09  hread_mutex) {..
dba0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dbb0: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
dbc0: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
dbd0: 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
dbe0: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72  -1);...}....pthr
dbf0: 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68  ead_retval = pth
dc00: 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
dc10: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e  pthread_mutex, N
dc20: 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72  ULL);...if (pthr
dc30: 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
dc40: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
dc50: 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
dc60: 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20  ad_mutex_init() 
dc70: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
dc80: 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
dc90: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
dca0: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a  rn(-1);...}....*
dcb0: 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f  mutex = pthread_
dcc0: 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b  mutex;..} else {
dcd0: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
dce0: 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20  gs.CreateMutex) 
dcf0: 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
dd00: 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
dd10: 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74  .CreateMutex(mut
dd20: 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
dd30: 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
dd40: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
dd50: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
dd60: 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  "cackey_args.Cre
dd70: 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72  ateMutex() retur
dd80: 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
dd90: 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
dda0: 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
ddb0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
ddc0: 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
ddd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
dde0: 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
ddf0: 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
de00: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn(0);.}../* Re
de10: 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
de20: 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
de30: 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
de40: 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20  ck(void *mutex) 
de50: 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
de60: 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
de70: 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
de80: 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
de90: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
dea0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
deb0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
dec0: 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
ded0: 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
dee0: 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
def0: 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
df00: 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
df10: 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a  mutex = mutex;..
df20: 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
df30: 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
df40: 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75  _lock(pthread_mu
df50: 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72  tex);...if (pthr
df60: 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
df70: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
df80: 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
df90: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20  ad_mutex_lock() 
dfa0: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
dfb0: 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
dfc0: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
dfd0: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65  rn(-1);...}..} e
dfe0: 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
dff0: 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
e000: 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
e010: 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
e020: 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75  rgs.LockMutex(mu
e030: 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
e040: 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
e050: 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
e060: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e070: 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f  ("cackey_args.Lo
e080: 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  ckMutex() return
e090: 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
e0a0: 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
e0b0: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
e0c0: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
e0d0: 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
e0e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
e0f0: 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
e100: 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
e110: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  rn(0);.}../* Ret
e120: 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
e130: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
e140: 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
e150: 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29  ock(void *mutex)
e160: 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
e170: 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
e180: 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
e190: 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
e1a0: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
e1b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e1c0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
e1d0: 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
e1e0: 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
e1f0: 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
e200: 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
e210: 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
e220: 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a  _mutex = mutex;.
e230: 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
e240: 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
e250: 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64  x_unlock(pthread
e260: 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70  _mutex);...if (p
e270: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d  thread_retval !=
e280: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
e290: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74  DEBUG_PRINTF("pt
e2a0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
e2b0: 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ck() returned er
e2c0: 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72  ror (%i).", pthr
e2d0: 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ead_retval);....
e2e0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
e2f0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
e300: 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  (cackey_args.Unl
e310: 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ockMutex) {....c
e320: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
e330: 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
e340: 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a  kMutex(mutex);..
e350: 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65  ...if (custom_re
e360: 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  tval != CKR_OK) 
e370: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
e380: 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
e390: 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
e3a0: 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
e3b0: 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
e3c0: 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
e3d0: 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
e3e0: 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
e3f0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e400: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
e410: 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
e420: 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
e430: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41  ;.}..static CK_A
e440: 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63  TTRIBUTE_PTR cac
e450: 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
e460: 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41  es(CK_OBJECT_CLA
e470: 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20  SS objectclass, 
e480: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
e490: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  sc_identity *ide
e4a0: 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
e4b0: 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75  long identity_nu
e4c0: 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  m, CK_ULONG_PTR 
e4d0: 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61  pulCount) {..sta
e4e0: 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f  tic CK_BBOOL ck_
e4f0: 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69  true = 1;..stati
e500: 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61  c CK_BBOOL ck_fa
e510: 6c 73 65 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f  lse = 0;..CK_ULO
e520: 4e 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c  NG numattrs = 0,
e530: 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09   retval_count;..
e540: 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50  CK_ATTRIBUTE_TYP
e550: 45 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  E curr_attr_type
e560: 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  ;..CK_ATTRIBUTE 
e570: 63 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76  curr_attr, *retv
e580: 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52  al;..CK_VOID_PTR
e590: 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f   pValue;..CK_ULO
e5a0: 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09  NG ulValueLen;..
e5b0: 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20  CK_OBJECT_CLASS 
e5c0: 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b  ck_object_class;
e5d0: 0a 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ..CK_CERTIFICATE
e5e0: 5f 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69  _TYPE ck_certifi
e5f0: 63 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b  cate_type;..CK_K
e600: 45 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74  EY_TYPE ck_key_t
e610: 79 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41  ype;..CK_UTF8CHA
e620: 52 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d  R ucTmpBuf[1024]
e630: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
e640: 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09   *certificate;..
e650: 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63  ssize_t certific
e660: 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35  ate_len = -1, x5
e670: 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e  09_read_ret;..in
e680: 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a  t pValue_free;..
e690: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e6a0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62  INTF("Called (ob
e6b0: 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c  jectClass = %lu,
e6c0: 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20   identity_num = 
e6d0: 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
e6e0: 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c  d long) objectcl
e6f0: 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75  ass, identity_nu
e700: 6d 29 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74  m);...if (object
e710: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
e720: 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65  TIFICATE && obje
e730: 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
e740: 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a  UBLIC_KEY && obj
e750: 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
e760: 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09  PRIVATE_KEY) {..
e770: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e780: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
e790: 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
e7a0: 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74  , invalid object
e7b0: 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74   class");....ret
e7c0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
e7d0: 2f 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09  /* Get Cert */..
e7e0: 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20  if (identity == 
e7f0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
e800: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
e810: 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
e820: 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c  ts (NULL), inval
e830: 69 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69  id identiy provi
e840: 64 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ded");....return
e850: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72  (NULL);..}...cer
e860: 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74  tificate = ident
e870: 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
e880: 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ;..certificate_l
e890: 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  en = identity->c
e8a0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
e8b0: 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
e8c0: 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63  e_len == -1 || c
e8d0: 65 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55  ertificate == NU
e8e0: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
e8f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
e900: 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
e910: 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64   (NULL), this id
e920: 65 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20  entity does not 
e930: 68 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65  have an X.509 ce
e940: 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69  rtificate associ
e950: 61 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64  ated with it and
e960: 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29   will not work")
e970: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e980: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66  );..}.../* Verif
e990: 79 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61  y that certifica
e9a0: 74 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f  te is ASN.1 enco
e9b0: 64 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66  ded X.509 certif
e9c0: 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35  icate */..if (x5
e9d0: 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72  09_to_serial(cer
e9e0: 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
e9f0: 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29  icate_len, NULL)
ea00: 20 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 0) {...CACKEY
ea10: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
ea20: 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
ea30: 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58  ts (NULL), the X
ea40: 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
ea50: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ea60: 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69   this identity i
ea70: 73 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a  s not valid");..
ea80: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
ea90: 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e  .}...retval_coun
eaa0: 74 20 3d 20 31 36 3b 0a 09 72 65 74 76 61 6c 20  t = 16;..retval 
eab0: 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f  = malloc(retval_
eac0: 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
ead0: 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20  retval));...for 
eae0: 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  (curr_attr_type 
eaf0: 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74  = 0; curr_attr_t
eb00: 79 70 65 20 3c 20 30 78 63 65 35 33 36 33 35 66  ype < 0xce53635f
eb10: 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ; curr_attr_type
eb20: 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72  ++) {...if (curr
eb30: 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78  _attr_type == 0x
eb40: 38 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61  800) {....curr_a
eb50: 74 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35  ttr_type = 0xce5
eb60: 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56  36300;...}....pV
eb70: 61 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09  alue_free = 0;..
eb80: 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
eb90: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
eba0: 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
ebb0: 73 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74  switch (curr_att
ebc0: 72 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  r_type) {....cas
ebd0: 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09  e CKA_CLASS:....
ebe0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ebf0: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
ec00: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
ec10: 4c 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e  LASS (0x%08lx) .
ec20: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
ec30: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
ec40: 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62  ype);......ck_ob
ec50: 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a  ject_class = obj
ec60: 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70  ectclass;......p
ec70: 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65  Value = &ck_obje
ec80: 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c  ct_class;.....ul
ec90: 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
eca0: 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  f(ck_object_clas
ecb0: 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  s);......CACKEY_
ecc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
ecd0: 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
ece0: 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
ecf0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
ed00: 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a  K_OBJECT_CLASS *
ed10: 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
ed20: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
ed30: 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
ed40: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
ed50: 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09  ase CKA_TOKEN:..
ed60: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ed70: 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
ed80: 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
ed90: 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29  _TOKEN (0x%08lx)
eda0: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
edb0: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
edc0: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
edd0: 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
ede0: 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
edf0: 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
ee00: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
ee10: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
ee20: 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
ee30: 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
ee40: 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
ee50: 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
ee60: 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
ee70: 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
ee80: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
ee90: 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d  k;....case CKA_M
eea0: 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43  ODIFIABLE:.....C
eeb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
eec0: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
eed0: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44  ttribute CKA_MOD
eee0: 49 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78  IFIABLE (0x%08lx
eef0: 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
ef00: 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
ef10: 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
ef20: 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
ef30: 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
ef40: 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
ef50: 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  se);......CACKEY
ef60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
ef70: 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
ef80: 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
ef90: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
efa0: 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
efb0: 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
efc0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
efd0: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
efe0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
eff0: 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43  A_LABEL:.....CAC
f000: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f010: 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
f020: 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c  ribute CKA_LABEL
f030: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
f040: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
f050: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
f060: 3b 0a 0a 09 09 09 09 2f 2a 20 44 65 74 65 72 6d  ;....../* Determ
f070: 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09  ine name */.....
f080: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
f090: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f0a0: 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 69 64  tity_to_label(id
f0b0: 65 6e 74 69 74 79 2c 20 75 63 54 6d 70 42 75 66  entity, ucTmpBuf
f0c0: 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75  , sizeof(ucTmpBu
f0d0: 66 29 29 3b 0a 09 09 09 09 69 66 20 28 78 35 30  f));.....if (x50
f0e0: 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 30 29 20  9_read_ret > 0) 
f0f0: 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
f100: 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 09 75  ucTmpBuf;......u
f110: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
f120: 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 7d  _read_ret;.....}
f130: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
f140: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
f150: 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
f160: 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
f170: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
f180: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
f190: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
f1a0: 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43  A_VALUE:.....CAC
f1b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f1c0: 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
f1d0: 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45  ribute CKA_VALUE
f1e0: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
f1f0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
f200: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
f210: 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f  ;......switch (o
f220: 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09  bjectclass) {...
f230: 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56  ...case CKO_PRIV
f240: 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43  ATE_KEY:.......C
f250: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f260: 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
f270: 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
f280: 75 73 65 20 77 65 20 61 72 65 20 61 20 70 72 69  use we are a pri
f290: 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09  vate key.");....
f2a0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
f2b0: 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  case CKO_PUBLIC_
f2c0: 4b 45 59 3a 0a 09 09 09 09 09 09 2f 2a 20 58 58  KEY:......./* XX
f2d0: 58 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09 09  X: TODO */......
f2e0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
f2f0: 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  se CKO_CERTIFICA
f300: 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65  TE:.......pValue
f310: 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a   = certificate;.
f320: 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
f330: 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c   = certificate_l
f340: 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  en;........break
f350: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
f360: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f370: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
f380: 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
f390: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
f3a0: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
f3b0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
f3c0: 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09  se CKA_ISSUER:..
f3d0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f3e0: 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
f3f0: 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
f400: 5f 49 53 53 55 45 52 20 28 30 78 25 30 38 6c 78  _ISSUER (0x%08lx
f410: 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
f420: 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
f430: 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
f440: 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
f450: 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
f460: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
f470: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
f480: 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
f490: 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
f4a0: 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
f4b0: 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09  ficate.");......
f4c0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
f4d0: 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
f4e0: 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
f4f0: 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
f500: 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75  t = x509_to_issu
f510: 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  er(certificate, 
f520: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
f530: 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
f540: 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
f550: 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
f560: 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
f570: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
f580: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
f590: 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
f5a0: 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
f5b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f5c0: 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
f5d0: 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
f5e0: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
f5f0: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
f600: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
f610: 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c  .case CKA_SERIAL
f620: 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43  _NUMBER:.....CAC
f630: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f640: 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
f650: 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41  ribute CKA_SERIA
f660: 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c  L_NUMBER (0x%08l
f670: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
f680: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
f690: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
f6a0: 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
f6b0: 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
f6c0: 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  E) {......CACKEY
f6d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
f6e0: 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
f6f0: 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
f700: 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
f710: 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09  ificate.");.....
f720: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
f730: 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
f740: 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
f750: 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
f760: 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72  et = x509_to_ser
f770: 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
f780: 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
f790: 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
f7a0: 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
f7b0: 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
f7c0: 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
f7d0: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
f7e0: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
f7f0: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
f800: 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
f810: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f820: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
f830: 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
f840: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
f850: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
f860: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
f870: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42  ....case CKA_SUB
f880: 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  JECT:.....CACKEY
f890: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
f8a0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
f8b0: 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20  ute CKA_SUBJECT 
f8c0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
f8d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f8e0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
f8f0: 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
f900: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
f910: 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
f920: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f930: 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
f940: 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
f950: 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
f960: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22   a certificate."
f970: 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
f980: 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
f990: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
f9a0: 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
f9b0: 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
f9c0: 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74  _to_subject(cert
f9d0: 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
f9e0: 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
f9f0: 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
fa00: 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
fa10: 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
fa20: 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
fa30: 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
fa40: 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
fa50: 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
fa60: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
fa70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
fa80: 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
fa90: 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
faa0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
fab0: 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
fac0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
fad0: 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45  KA_ID:.....CACKE
fae0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
faf0: 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
fb00: 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25  bute CKA_ID (0x%
fb10: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
fb20: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
fb30: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
fb40: 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20  ..ucTmpBuf[0] = 
fb50: 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b  ((identity_num +
fb60: 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66   1) >> 8) & 0xff
fb70: 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31  ;.....ucTmpBuf[1
fb80: 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e  ] =  (identity_n
fb90: 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a  um + 1) & 0xff;.
fba0: 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75  .....pValue = &u
fbb0: 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56  cTmpBuf;.....ulV
fbc0: 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09  alueLen = 2;....
fbd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
fbe0: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
fbf0: 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
fc00: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
fc10: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
fc20: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
fc30: 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
fc40: 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09  IFICATE_TYPE:...
fc50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
fc60: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
fc70: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
fc80: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
fc90: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
fca0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
fcb0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
fcc0: 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
fcd0: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
fce0: 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
fcf0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
fd00: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
fd10: 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
fd20: 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
fd30: 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e  t a certificate.
fd40: 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
fd50: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
fd60: 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f  e only support o
fd70: 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74  ne certificate t
fd80: 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65  ype */.....ck_ce
fd90: 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d  rtificate_type =
fda0: 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09   CKC_X_509;.....
fdb0: 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65  .pValue = &ck_ce
fdc0: 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a  rtificate_type;.
fdd0: 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
fde0: 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69   sizeof(ck_certi
fdf0: 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09  ficate_type);...
fe00: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fe10: 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
fe20: 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39  urning CKC_X_509
fe30: 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22   (%lu) (%p/%lu)"
fe40: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
fe50: 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43  ) *((CK_CERTIFIC
fe60: 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c  ATE_TYPE *) pVal
fe70: 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
fe80: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
fe90: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
fea0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
feb0: 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09  A_KEY_TYPE:.....
fec0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
fed0: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
fee0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45  attribute CKA_KE
fef0: 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29  Y_TYPE (0x%08lx)
ff00: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
ff10: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
ff20: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
ff30: 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
ff40: 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
ff50: 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
ff60: 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
ff70: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
ff80: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
ff90: 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
ffa0: 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
ffb0: 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22   are not a key."
ffc0: 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
ffd0: 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
ffe0: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e   only support on
fff0: 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09  e key type */...
10000 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20  ..ck_key_type = 
10010 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56  CKK_RSA;......pV
10020 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74  alue = &ck_key_t
10030 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ype;.....ulValue
10040 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
10050 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  key_type);......
10060 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10070 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
10080 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75  ing CKK_RSA (%lu
10090 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  ) (%p/%lu)", (un
100a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
100b0 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  CK_CERTIFICATE_T
100c0 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  YPE *) pValue), 
100d0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
100e0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
100f0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
10100 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ....case CKA_SIG
10110 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  N:.....CACKEY_DE
10120 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
10130 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
10140 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38   CKA_SIGN (0x%08
10150 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
10160 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
10170 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
10180 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
10190 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
101a0 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
101b0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
101c0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
101d0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
101e0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
101f0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
10200 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
10210 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
10220 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
10230 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
10240 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
10250 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
10260 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
10270 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
10280 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
10290 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
102a0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
102b0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
102c0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45  ;....case CKA_DE
102d0 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45  CRYPT:.....CACKE
102e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
102f0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
10300 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54  bute CKA_DECRYPT
10310 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
10320 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
10330 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
10340 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
10350 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
10360 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a  IVATE_KEY || obj
10370 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
10380 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09  PUBLIC_KEY) {...
10390 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
103a0 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
103b0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
103c0 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
103d0 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
103e0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
103f0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
10400 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
10410 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
10420 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10430 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
10440 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
10450 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
10460 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
10470 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
10480 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
10490 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
104a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
104b0 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56  e CKA_TRUST_SERV
104c0 45 52 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43  ER_AUTH:.....CAC
104d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
104e0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
104f0 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54  ribute CKA_TRUST
10500 5f 53 45 52 56 45 52 5f 41 55 54 48 20 28 30 78  _SERVER_AUTH (0x
10510 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
10520 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
10530 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
10540 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
10550 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
10560 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
10570 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
10580 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10590 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
105a0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
105b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
105c0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
105d0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
105e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
105f0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
10600 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
10610 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e   CKA_TRUST_CLIEN
10620 54 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b  T_AUTH:.....CACK
10630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10640 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
10650 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
10660 43 4c 49 45 4e 54 5f 41 55 54 48 20 28 30 78 25  CLIENT_AUTH (0x%
10670 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
10680 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
10690 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
106a0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
106b0 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
106c0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
106d0 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
106e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
106f0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
10700 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
10710 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
10720 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
10730 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
10740 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
10750 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
10760 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
10770 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53  CKA_TRUST_CODE_S
10780 49 47 4e 49 4e 47 3a 0a 09 09 09 09 43 41 43 4b  IGNING:.....CACK
10790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
107a0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
107b0 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
107c0 43 4f 44 45 5f 53 49 47 4e 49 4e 47 20 28 30 78  CODE_SIGNING (0x
107d0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
107e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
107f0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
10800 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
10810 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
10820 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
10830 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
10840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10850 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
10860 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
10870 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10880 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
10890 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
108a0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
108b0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
108c0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
108d0 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c   CKA_TRUST_EMAIL
108e0 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09  _PROTECTION:....
108f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10900 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
10910 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
10920 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45  RUST_EMAIL_PROTE
10930 43 54 49 4f 4e 20 28 30 78 25 30 38 6c 78 29 20  CTION (0x%08lx) 
10940 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
10950 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
10960 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
10970 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
10980 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
10990 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
109a0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
109b0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
109c0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
109d0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
109e0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
109f0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
10a00 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
10a10 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
10a20 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
10a30 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  ;....default:...
10a40 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
10a50 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
10a60 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
10a70 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
10a80 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29  ..if (((CK_LONG)
10a90 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20   ulValueLen) != 
10aa0 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20  ((CK_LONG) -1)) 
10ab0 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72  {..../* Push cur
10ac0 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20  r_attr onto the 
10ad0 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72  stack */....curr
10ae0 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72  _attr.type = cur
10af0 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09  r_attr_type;....
10b00 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
10b10 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65  eLen = ulValueLe
10b20 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72  n;.....curr_attr
10b30 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63  .pValue = malloc
10b40 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c  (curr_attr.ulVal
10b50 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70  ueLen);....memcp
10b60 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c  y(curr_attr.pVal
10b70 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72  ue, pValue, curr
10b80 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
10b90 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75  );.....if (pValu
10ba0 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65  e_free && pValue
10bb0 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61  ) {.....free(pVa
10bc0 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  lue);....}.....i
10bd0 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72  f (numattrs >= r
10be0 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09  etval_count) {..
10bf0 09 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
10c00 2a 3d 20 32 3b 0a 09 09 09 09 72 65 74 76 61 6c  *= 2;.....retval
10c10 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61   = realloc(retva
10c20 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  l, retval_count 
10c30 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c  * sizeof(*retval
10c40 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  ));....}.....mem
10c50 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61  cpy(&retval[numa
10c60 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74  ttrs], &curr_att
10c70 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  r, sizeof(curr_a
10c80 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74  ttr));....numatt
10c90 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  rs++;...}..}...i
10ca0 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30  f (numattrs != 0
10cb0 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75  ) {...retval_cou
10cc0 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09  nt = numattrs;..
10cd0 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f  .retval = reallo
10ce0 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c  c(retval, retval
10cf0 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  _count * sizeof(
10d00 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c  *retval));..} el
10d10 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76  se {...free(retv
10d20 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d  al);....retval =
10d30 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c   NULL;..}...*pul
10d40 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  Count = numattrs
10d50 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
10d60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
10d70 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28  ng %lu objects (
10d80 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c  %p).", numattrs,
10d90 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
10da0 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
10db0 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
10dc0 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65  y_free_identitie
10dd0 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
10de0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
10df0 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  ties, unsigned l
10e00 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63  ong identities_c
10e10 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52  ount) {..CK_ATTR
10e20 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
10e30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
10e40 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64   id_idx, attr_id
10e50 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  x;...if (identit
10e60 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69  ies == NULL || i
10e70 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
10e80 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e  == 0) {...return
10e90 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69  ;..}...for (id_i
10ea0 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c  dx = 0; id_idx <
10eb0 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
10ec0 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09  t; id_idx++) {..
10ed0 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
10ee0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
10ef0 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74  es) {....for (at
10f00 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
10f10 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65  _idx < identitie
10f20 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
10f30 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72  utes_count; attr
10f40 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75  _idx++) {.....cu
10f50 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74  rr_attr = &ident
10f60 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
10f70 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64  tributes[attr_id
10f80 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72  x];......if (cur
10f90 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20  r_attr->pValue) 
10fa0 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
10fb0 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a  _attr->pValue);.
10fc0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
10fd0 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f (identities[id
10fe0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
10ff0 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65  ) {.....free(ide
11000 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
11010 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09  attributes);....
11020 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65  }.....cackey_fre
11030 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 69  e_certs(identiti
11040 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
11050 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b  identity, 1, 1);
11060 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69  ...}..}...free(i
11070 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73  dentities);.}..s
11080 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
11090 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  key_identity *ca
110a0 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
110b0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
110c0 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
110d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64  nsigned long *id
110e0 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75  s_found) {..stru
110f0 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
11100 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
11110 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63  entities;..struc
11120 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
11130 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  y *identities;..
11140 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
11150 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63  m_ids, id_idx, c
11160 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e  urr_id_type;..un
11170 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
11180 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b  certs, cert_idx;
11190 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
111a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
111b0 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75  );...if (ids_fou
111c0 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
111d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
111e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73  NTF("Error.  ids
111f0 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29  _found is NULL")
11200 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
11210 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65  );..}...pcsc_ide
11220 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
11230 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74  _read_certs(slot
11240 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
11250 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69  ts);..if (pcsc_i
11260 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c  dentities != NUL
11270 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72  L) {.../* Conver
11280 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74  t number of Cert
11290 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f  s to number of o
112a0 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f  bjects */...num_
112b0 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41  ids = (CKO_PRIVA
112c0 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52  TE_KEY - CKO_CER
112d0 54 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20  TIFICATE + 1) * 
112e0 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 64  num_certs;....id
112f0 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f  entities = mallo
11300 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65  c(num_ids * size
11310 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29  of(*identities))
11320 3b 0a 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b  ;....id_idx = 0;
11330 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78  ...for (cert_idx
11340 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c   = 0; cert_idx <
11350 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74   num_certs; cert
11360 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72  _idx++) {....for
11370 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d   (curr_id_type =
11380 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
11390 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c  ; curr_id_type <
113a0 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
113b0 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b  Y; curr_id_type+
113c0 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74  +) {.....identit
113d0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
113e0 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
113f0 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63  get_attributes(c
11400 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63  urr_id_type, &pc
11410 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
11420 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64  rt_idx], cert_id
11430 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
11440 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
11450 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69  s_count);......i
11460 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f (identities[id
11470 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
11480 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
11490 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
114a0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
114b0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09 7d 0a  ount = 0;.....}.
114c0 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
114d0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
114e0 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
114f0 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
11500 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
11510 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d  dentity));.....m
11520 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73  emcpy(identities
11530 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
11540 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64  entity, &pcsc_id
11550 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
11560 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e  x], sizeof(*iden
11570 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
11580 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a  csc_identity));.
11590 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
115a0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
115b0 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
115c0 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63  te = malloc(pcsc
115d0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
115e0 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
115f0 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63  e_len);.....memc
11600 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  py(identities[id
11610 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
11620 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
11630 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  , pcsc_identitie
11640 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
11650 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64  ificate, pcsc_id
11660 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
11670 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  x].certificate_l
11680 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78  en);......id_idx
11690 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ++;....}...}....
116a0 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
116b0 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  s(pcsc_identitie
116c0 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29  s, num_certs, 1)
116d0 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20  ;....*ids_found 
116e0 3d 20 6e 75 6d 5f 69 64 73 3b 0a 09 09 72 65 74  = num_ids;...ret
116f0 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b  urn(identities);
11700 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64  ..}...*ids_found
11710 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55   = 0;..return(NU
11720 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  LL);.}..CK_DEFIN
11730 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
11740 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28  , C_Initialize)(
11750 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69  CK_VOID_PTR pIni
11760 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49  tArgs) {..CK_C_I
11770 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43  NITIALIZE_ARGS C
11780 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e  K_PTR args;..uin
11790 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20  t32_t idx;..int 
117a0 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a  mutex_init_ret;.
117b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
117c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
117d0 3b 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67  ;...if (pInitArg
117e0 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61  s != NULL) {...a
117f0 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b  rgs = pInitArgs;
11800 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65  ...memcpy(&cacke
11810 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69  y_args, args, si
11820 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73  zeof(cackey_args
11830 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d  ));....if (args-
11840 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20  >CreateMutex == 
11850 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65  NULL || args->De
11860 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55  stroyMutex == NU
11870 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b  LL || args->Lock
11880 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
11890 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74   args->UnlockMut
118a0 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ex == NULL) {...
118b0 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74  .if (args->Creat
118c0 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  eMutex != NULL |
118d0 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d  | args->DestroyM
118e0 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  utex != NULL || 
118f0 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20  args->LockMutex 
11900 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
11910 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20  >UnlockMutex != 
11920 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  NULL) {.....CACK
11930 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11940 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75  "Error. Some, bu
11950 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64  t not All thread
11960 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70  ing primitives p
11970 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09  rovided.");.....
11980 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
11990 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d  MENTS_BAD);....}
119a0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 61 72 67 73  ...}....if (args
119b0 2d 3e 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e  ->pReserved != N
119c0 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ULL) {....CACKEY
119d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
119e0 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
119f0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
11a00 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
11a10 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
11a20 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63  .}..} else {...c
11a30 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
11a40 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  eMutex = NULL;..
11a50 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73  .cackey_args.Des
11a60 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  troyMutex = NULL
11a70 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
11a80 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  LockMutex = NULL
11a90 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
11aa0 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55  UnlockMutex = NU
11ab0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
11ac0 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a  s.flags = 0;..}.
11ad0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69  ..if (cackey_ini
11ae0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
11af0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11b00 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61  F("Error.  Alrea
11b10 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  dy initialized."
11b20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
11b30 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44  _CRYPTOKI_ALREAD
11b40 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  Y_INITIALIZED);.
11b50 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
11b60 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
11b70 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
11b80 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
11b90 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
11ba0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b   idx++) {...cack
11bb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
11bc0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  .active = 0;..}.
11bd0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
11be0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
11bf0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
11c00 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
11c10 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
11c20 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
11c30 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b  idx].active = 0;
11c40 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
11c50 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  idx].pcsc_reader
11c60 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
11c70 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61  y_slots[idx].tra
11c80 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
11c90 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
11ca0 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73  ts[idx].slot_res
11cb0 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63  et = 0;..}...cac
11cc0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
11cd0 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  = 1;...if (!cack
11ce0 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29  ey_biglock_init)
11cf0 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f   {...mutex_init_
11d00 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  ret = cackey_mut
11d10 65 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65  ex_create(&cacke
11d20 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69  y_biglock);....i
11d30 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  f (mutex_init_re
11d40 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t != 0) {....CAC
11d50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11d60 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20  ("Error.  Mutex 
11d70 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  initialization f
11d80 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
11d90 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f  turn(CKR_CANT_LO
11da0 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  CK);...}....cack
11db0 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20  ey_biglock_init 
11dc0 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  = 1;..}...CACKEY
11dd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
11de0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
11df0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
11e00 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
11e10 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
11e20 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
11e30 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f  _Finalize)(CK_VO
11e40 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64  ID_PTR pReserved
11e50 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
11e60 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
11e70 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
11e80 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65  .");...if (pRese
11e90 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rved != NULL) {.
11ea0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11eb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52  RINTF("Error. pR
11ec0 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e  eserved is not N
11ed0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
11ee0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
11ef0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
11f00 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
11f10 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
11f20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
11f30 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
11f40 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
11f50 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
11f60 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
11f70 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
11f80 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
11f90 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
11fa0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
11fb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
11fc0 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
11fd0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
11fe0 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
11ff0 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69  ....C_CloseSessi
12000 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a  on(idx);...}..}.
12010 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
12020 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
12030 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
12040 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
12050 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
12060 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
12070 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ts[0])); idx++) 
12080 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
12090 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
120a0 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65  eader) {....free
120b0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
120c0 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  x].pcsc_reader);
120d0 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
120e0 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
120f0 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69  ();...cackey_ini
12100 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09  tialized = 0;...
12110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12120 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
12130 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
12140 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
12150 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
12160 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
12170 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28  _RV, C_GetInfo)(
12180 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  CK_INFO_PTR pInf
12190 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
121a0 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63  UTF8CHAR manufac
121b0 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53  turerID[] = "U.S
121c0 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09  . Government";..
121d0 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
121e0 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  AR libraryDescri
121f0 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
12200 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  y";...CACKEY_DEB
12210 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
12220 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
12230 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
12240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12250 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
12260 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
12270 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
12280 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
12290 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
122a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
122b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
122c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
122d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
122e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
122f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
12300 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  IZED);..}...pInf
12310 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
12320 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
12330 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
12340 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
12350 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
12360 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
12370 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
12380 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
12390 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
123a0 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74  & 0xff;...memset
123b0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
123c0 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
123d0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
123e0 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65  acturerID));..me
123f0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
12400 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75  facturerID, manu
12410 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65  facturerID, size
12420 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49  of(manufacturerI
12430 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f  D) - 1);...pInfo
12440 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a  ->flags = 0x00;.
12450 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
12460 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
12470 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
12480 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
12490 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
124a0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mcpy(pInfo->libr
124b0 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
124c0 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
124d0 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61  on, sizeof(libra
124e0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d  ryDescription) -
124f0 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69   1);...pInfo->li
12500 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a  braryVersion.maj
12510 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
12520 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
12530 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
12540 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
12550 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
12560 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
12570 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43  8) & 0xff;...CAC
12580 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12590 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
125a0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
125b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
125c0 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72  OK);.}../*. * Pr
125d0 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65  ocess list of re
125e0 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74  aders, and creat
125f0 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65  e mapping betwee
12600 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e  n reader name an
12610 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b  d slot ID. */.CK
12620 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
12630 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
12640 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20  tList)(CK_BBOOL 
12650 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b  tokenPresent, CK
12660 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
12670 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  otList, CK_ULONG
12680 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
12690 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
126a0 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f  al;..int pcsc_co
126b0 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55  nnect_ret;..CK_U
126c0 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74  LONG count, slot
126d0 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72  _count = 0, curr
126e0 73 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73  slot;..char *pcs
126f0 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63  c_readers, *pcsc
12700 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73  _readers_s, *pcs
12710 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57  c_readers_e;..DW
12720 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73  ORD pcsc_readers
12730 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _len;..LONG scar
12740 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
12750 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f  t;..size_t curr_
12760 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41  reader_len;...CA
12770 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12780 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
12790 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20  if (pulCount == 
127a0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
127b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
127c0 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69  rror. pulCount i
127d0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
127e0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
127f0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
12800 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
12810 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
12820 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12830 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
12840 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
12850 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
12860 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
12870 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ED);..}...mutex_
12880 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
12890 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
128a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
128b0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
128c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
128d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
128e0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
128f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
12900 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
12910 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c  ROR);..}.../* Cl
12920 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  ear list of slot
12930 73 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c  s */..if (pSlotL
12940 69 73 74 29 20 7b 0a 09 09 2f 2a 20 4f 6e 6c 79  ist) {.../* Only
12950 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74   update the list
12960 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20   of slots if we 
12970 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69  are actually bei
12980 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c  ng supply the sl
12990 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ot information *
129a0 2f 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  /...cackey_slots
129b0 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
129c0 29 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 73  );....for (currs
129d0 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
129e0 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
129f0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
12a00 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
12a10 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
12a20 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
12a30 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
12a40 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b  ].pcsc_reader) {
12a50 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
12a60 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
12a70 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a  .pcsc_reader);..
12a80 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
12a90 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
12aa0 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
12ab0 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ..}.....cackey_s
12ac0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
12ad0 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09  ctive = 0;...}..
12ae0 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
12af0 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
12b00 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63   */..pcsc_connec
12b10 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
12b20 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
12b30 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
12b40 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
12b50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
12b60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12b70 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
12b80 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61   PC/SC failed, a
12b90 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73  ssuming no slots
12ba0 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e  ");....slot_coun
12bb0 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  t = 0;..} else {
12bc0 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
12bd0 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72  len = 0;....scar
12be0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
12bf0 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
12c00 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
12c10 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
12c20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64  NULL, &pcsc_read
12c30 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28  ers_len);...if (
12c40 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
12c50 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
12c60 5f 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63  _SUCCESS && pcsc
12c70 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20  _readers_len != 
12c80 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61  0) {....pcsc_rea
12c90 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  ders = malloc(pc
12ca0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
12cb0 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
12cc0 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _s = pcsc_reader
12cd0 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73  s;.....scard_lis
12ce0 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53  treaders_ret = S
12cf0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
12d00 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
12d10 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f  dle, NULL, pcsc_
12d20 72 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72  readers, &pcsc_r
12d30 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
12d40 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
12d50 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
12d60 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
12d70 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
12d80 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _e = pcsc_reader
12d90 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73  s + pcsc_readers
12da0 5f 6c 65 6e 3b 0a 0a 09 09 09 09 63 75 72 72 73  _len;......currs
12db0 6c 6f 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69  lot = 0;.....whi
12dc0 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73  le (pcsc_readers
12dd0 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   < pcsc_readers_
12de0 65 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 72  e) {......curr_r
12df0 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c  eader_len = strl
12e00 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29  en(pcsc_readers)
12e10 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73  ;.......if ((pcs
12e20 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72  c_readers + curr
12e30 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70  _reader_len) > p
12e40 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
12e50 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
12e60 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63  ...}.......if (c
12e70 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
12e80 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65  = 0) {.......bre
12e90 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
12ea0 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d  .if (currslot >=
12eb0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
12ec0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
12ed0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
12ee0 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  )) {.......CACKE
12ef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12f00 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65  Found more reade
12f10 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72  rs than slots ar
12f20 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a  e available!");.
12f30 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
12f40 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45  ...}.......CACKE
12f50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12f60 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73  Found reader: %s
12f70 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29  ", pcsc_readers)
12f80 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20  ;......./* Only 
12f90 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
12fa0 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
12fb0 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
12fc0 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  g supply the slo
12fd0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
12fe0 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c  ......if (pSlotL
12ff0 69 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61 63  ist) {.......cac
13000 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
13010 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a  ot].active = 1;.
13020 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
13030 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
13040 63 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75  c_reader = strdu
13050 70 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  p(pcsc_readers);
13060 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
13070 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
13080 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
13090 64 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63  d = 0;.......cac
130a0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
130b0 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot].transaction_
130c0 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09  depth = 0;......
130d0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
130e0 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73  rrslot].slot_res
130f0 65 74 20 3d 20 31 3b 0a 09 09 09 09 09 7d 0a 09  et = 1;......}..
13100 09 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a  ....currslot++;.
13110 0a 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  ......pcsc_reade
13120 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65  rs += curr_reade
13130 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d  r_len + 1;.....}
13140 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c  ......if (currsl
13150 6f 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73  ot > 0) {......s
13160 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72  lot_count = curr
13170 73 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  slot;.....}....}
13180 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
13190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
131a0 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20  "Second call to 
131b0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
131c0 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
131d0 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
131e0 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
131f0 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
13200 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
13210 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
13220 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
13230 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28  ;....}.....free(
13240 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b  pcsc_readers_s);
13250 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
13260 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13270 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74  TF("First call t
13280 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
13290 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
132a0 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
132b0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
132c0 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
132d0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
132e0 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
132f0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
13300 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  t);...}..}...mut
13310 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
13320 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
13330 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
13340 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
13350 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
13360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13370 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
13380 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
13390 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
133a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
133b0 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20  ..if (pSlotList 
133c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75  == NULL) {...*pu
133d0 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
133e0 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  unt;....CACKEY_D
133f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
13400 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
13410 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
13420 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
13430 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70  ..}...count = *p
13440 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f  ulCount;..if (co
13450 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt < slot_count
13460 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
13470 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
13480 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
13490 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
134a0 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e  t we have %lu en
134b0 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20  tries.", count, 
134c0 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  slot_count);....
134d0 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
134e0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09  R_TOO_SMALL);...
134f0 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  }...for (currslo
13500 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20  t = 0; currslot 
13510 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75  < slot_count; cu
13520 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 53  rrslot++) {...pS
13530 6c 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74  lotList[currslot
13540 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 7d  ] = currslot;..}
13550 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73  ...*pulCount = s
13560 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43  lot_count;...CAC
13570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13580 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
13590 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20  OK (%i).  Found 
135a0 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43  %lu readers.", C
135b0 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64  KR_OK, (unsigned
135c0 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e   long) slot_coun
135d0 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  t);...return(CKR
135e0 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65  _OK);...tokenPre
135f0 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73  sent = tokenPres
13600 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20  ent; /* Supress 
13610 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20  unused variable 
13620 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b  warning */.}..CK
13630 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
13640 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
13650 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  tInfo)(CK_SLOT_I
13660 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f  D slotID, CK_SLO
13670 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  T_INFO_PTR pInfo
13680 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
13690 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63  TF8CHAR slotDesc
136a0 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43  ription[] = "CAC
136b0 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20  Key Slot";..int 
136c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
136d0 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  nt bytes_to_copy
136e0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
136f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
13700 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
13710 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
13720 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13730 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
13740 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
13750 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
13760 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
13770 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
13780 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
13790 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
137a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
137b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
137c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
137d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
137e0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
137f0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
13800 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
13810 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
13820 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
13830 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
13840 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13850 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
13860 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
13870 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
13880 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
13890 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
138a0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
138b0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
138c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
138d0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
138e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
138f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
13900 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
13910 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13920 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
13930 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
13940 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
13950 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
13960 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
13970 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
13980 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
13990 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
139a0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
139b0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
139c0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
139d0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
139e0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
139f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
13a00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
13a10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
13a20 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
13a30 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
13a40 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
13a50 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
13a60 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
13a70 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
13a80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13a90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
13aa0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
13ab0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
13ac0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
13ad0 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  R);..}...memset(
13ae0 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
13af0 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a  iption, ' ', siz
13b00 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  eof(pInfo->slotD
13b10 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d  escription));..m
13b20 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f  emcpy(pInfo->slo
13b30 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c  tDescription, sl
13b40 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  otDescription, s
13b50 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69  izeof(slotDescri
13b60 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d  ption) - 1);...m
13b70 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
13b80 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
13b90 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
13ba0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
13bb0 3b 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ;...bytes_to_cop
13bc0 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65  y = strlen(cacke
13bd0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
13be0 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69  pcsc_reader);..i
13bf0 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  f (sizeof(pInfo-
13c00 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
13c10 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   < bytes_to_copy
13c20 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63  ) {...bytes_to_c
13c30 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e  opy = sizeof(pIn
13c40 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
13c50 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28  ID);..}..memcpy(
13c60 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
13c70 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c  rerID, cackey_sl
13c80 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63  ots[slotID].pcsc
13c90 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74  _reader, bytes_t
13ca0 6f 5f 63 6f 70 79 29 3b 0a 0a 09 70 49 6e 66 6f  o_copy);...pInfo
13cb0 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52 45  ->flags = CKF_RE
13cc0 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 20 7c  MOVABLE_DEVICE |
13cd0 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09   CKF_HW_SLOT;...
13ce0 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
13cf0 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
13d00 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
13d10 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  == CACKEY_PCSC_S
13d20 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
13d30 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
13d40 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45  |= CKF_TOKEN_PRE
13d50 53 45 4e 54 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  SENT;..}...pInfo
13d60 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
13d70 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
13d80 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
13d90 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
13da0 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
13db0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
13dc0 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
13dd0 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
13de0 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
13df0 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
13e00 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
13e10 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
13e20 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
13e30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13e40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
13e50 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
13e60 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
13e70 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
13e80 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
13e90 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49  _RV, C_GetTokenI
13ea0 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
13eb0 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e  slotID, CK_TOKEN
13ec0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
13ed0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
13ee0 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
13ef0 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
13f00 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
13f10 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
13f20 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20   defaultLabel[] 
13f30 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e  = "Unknown Token
13f40 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
13f50 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d  F8CHAR model[] =
13f60 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73   "CAC Token";..s
13f70 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
13f80 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
13f90 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
13fa0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
13fb0 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20  certs;..ssize_t 
13fc0 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20  label_ret;..int 
13fd0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
13fe0 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  nt use_default_l
13ff0 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  abel;...CACKEY_D
14000 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
14010 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
14020 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
14030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14040 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
14050 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
14060 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
14070 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
14080 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
14090 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
140a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
140b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
140c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
140d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
140e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
140f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
14100 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
14110 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
14120 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
14130 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
14140 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
14150 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14160 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
14170 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
14180 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
14190 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
141a0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
141b0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
141c0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
141d0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
141e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
141f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
14200 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
14210 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
14220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14230 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
14240 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
14250 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
14260 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
14270 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
14280 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
14290 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
142a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
142b0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
142c0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
142d0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
142e0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
142f0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
14300 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
14310 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
14320 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
14330 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
14340 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
14350 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
14360 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
14370 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45  lotID]) != CACKE
14380 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
14390 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45  ESENT) {...CACKE
143a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
143b0 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73  No token is pres
143c0 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20  ent in slotID = 
143d0 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  %lu", slotID);..
143e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
143f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
14400 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
14410 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50  (CKR_TOKEN_NOT_P
14420 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75  RESENT);..}...mu
14430 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
14440 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
14450 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
14460 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
14470 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
14480 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14490 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
144a0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
144b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
144c0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
144d0 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
144e0 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d  token label from
144f0 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
14500 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
14510 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65  label, ' ', size
14520 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
14530 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  );..use_default_
14540 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 70 63 73  label = 1;...pcs
14550 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  c_identities = c
14560 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
14570 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
14580 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e  lotID], NULL, &n
14590 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28  um_certs);..if (
145a0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
145b0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20  != NULL) {...if 
145c0 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20  (num_certs > 0) 
145d0 7b 0a 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d  {....label_ret =
145e0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
145f0 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70  ntity_to_label(p
14600 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
14610 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69  pInfo->label, si
14620 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
14630 6c 29 29 3b 0a 09 09 09 69 66 20 28 6c 61 62 65  l));....if (labe
14640 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09  l_ret > 0) {....
14650 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62  .use_default_lab
14660 65 6c 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  el = 0;....}...}
14670 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
14680 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74  certs(pcsc_ident
14690 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73  ities, num_certs
146a0 2c 20 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  , 1);..}...if (u
146b0 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
146c0 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e  ) {...memcpy(pIn
146d0 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75  fo->label, defau
146e0 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ltLabel, sizeof(
146f0 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20  defaultLabel) - 
14700 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  1);..}...memset(
14710 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
14720 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
14730 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
14740 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
14750 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
14760 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
14770 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
14780 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
14790 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
147a0 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27  (pInfo->model, '
147b0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
147c0 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63  ->model));..memc
147d0 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c  py(pInfo->model,
147e0 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d   model, sizeof(m
147f0 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  odel) - 1);...me
14800 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69  mset(pInfo->seri
14810 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73  alNumber, ' ', s
14820 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72  izeof(pInfo->ser
14830 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d  ialNumber));...m
14840 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63  emset(pInfo->utc
14850 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f  Time, ' ', sizeo
14860 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  f(pInfo->utcTime
14870 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
14880 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
14890 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
148a0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
148b0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
148c0 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
148d0 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
148e0 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
148f0 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
14900 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
14910 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
14920 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
14930 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
14940 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f   = 0x00;...pInfo
14950 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52  ->flags = CKF_WR
14960 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20  ITE_PROTECTED | 
14970 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49  CKF_USER_PIN_INI
14980 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54  TIALIZED | CKF_T
14990 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44  OKEN_INITIALIZED
149a0 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   | CKF_LOGIN_REQ
149b0 55 49 52 45 44 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  UIRED;...pInfo->
149c0 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e  ulMaxSessionCoun
149d0 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t = (sizeof(cack
149e0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
149f0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
14a00 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a  sions[0])) - 1;.
14a10 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f  .pInfo->ulSessio
14a20 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56  nCount = CK_UNAV
14a30 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
14a40 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ION;..pInfo->ulM
14a50 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74  axRwSessionCount
14a60 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   = 0;..pInfo->ul
14a70 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  RwSessionCount =
14a80 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
14a90 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
14aa0 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e  nfo->ulMaxPinLen
14ab0 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e   = 128;..pInfo->
14ac0 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b  ulMinPinLen = 0;
14ad0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c  ..pInfo->ulTotal
14ae0 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43  PublicMemory = C
14af0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
14b00 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
14b10 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d  o->ulFreePublicM
14b20 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
14b30 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
14b40 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f  ON;..pInfo->ulTo
14b50 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79  talPrivateMemory
14b60 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
14b70 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
14b80 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69  pInfo->ulFreePri
14b90 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  vateMemory = CK_
14ba0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
14bb0 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45  RMATION;...CACKE
14bc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14bd0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
14be0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
14bf0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
14c00 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
14c10 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
14c20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65  C_WaitForSlotEve
14c30 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61  nt)(CK_FLAGS fla
14c40 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50  gs, CK_SLOT_ID_P
14c50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56  TR pSlotID, CK_V
14c60 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65  OID_PTR pReserve
14c70 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  d) {..CACKEY_DEB
14c80 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
14c90 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73  d.");...if (pRes
14ca0 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b  erved != NULL) {
14cb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14cc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
14cd0 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20  Reserved is not 
14ce0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
14cf0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
14d00 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
14d10 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
14d20 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
14d30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
14d40 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
14d50 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
14d60 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
14d70 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
14d80 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
14d90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
14da0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
14db0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
14dc0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
14dd0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
14de0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
14df0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
14e00 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
14e10 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
14e20 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65  N(CK_RV, C_GetMe
14e30 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f  chanismList)(CK_
14e40 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
14e50 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50  CK_MECHANISM_TYP
14e60 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  E_PTR pMechanism
14e70 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  List, CK_ULONG_P
14e80 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  TR pulCount) {..
14e90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14ea0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
14eb0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
14ec0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
14ed0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14ee0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
14ef0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
14f00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
14f10 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
14f20 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
14f30 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55   (pulCount == NU
14f40 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
14f50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14f60 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73  or.  pulCount is
14f70 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
14f80 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
14f90 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
14fa0 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20  (pMechanismList 
14fb0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75  == NULL) {...*pu
14fc0 6c 43 6f 75 6e 74 20 3d 20 33 3b 0a 0a 09 09 43  lCount = 3;....C
14fd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14fe0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
14ff0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
15000 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
15010 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
15020 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 33 29 20  (*pulCount < 3) 
15030 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15040 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
15050 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c   Buffer too smal
15060 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  l.");....return(
15070 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
15080 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63  MALL);..}...pMec
15090 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20  hanismList[0] = 
150a0 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 70  CKM_RSA_PKCS;..p
150b0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 31 5d  MechanismList[1]
150c0 20 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f   = CKM_SHA1_RSA_
150d0 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74  PKCS;..*pulCount
150e0 20 3d 20 32 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 2;...CACKEY_D
150f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
15100 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
15110 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
15120 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
15130 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
15140 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
15150 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29  etMechanismInfo)
15160 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
15170 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  ID, CK_MECHANISM
15180 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d  _TYPE type, CK_M
15190 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54  ECHANISM_INFO_PT
151a0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20  R pInfo) {..int 
151b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
151c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
151d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
151e0 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
151f0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
15200 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
15210 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
15220 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
15230 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
15240 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
15250 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
15260 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
15270 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15280 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
15290 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
152a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
152b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
152c0 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
152d0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
152e0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
152f0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
15300 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
15310 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
15320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
15330 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
15340 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
15350 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
15360 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
15370 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
15380 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
15390 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
153a0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
153b0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
153c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
153d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
153e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
153f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15400 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
15410 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
15420 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
15430 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
15440 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
15450 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
15460 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15470 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
15480 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
15490 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
154a0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
154b0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
154c0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
154d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
154e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
154f0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
15500 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
15510 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
15520 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
15530 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
15540 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
15550 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
15560 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15570 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
15580 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
15590 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
155a0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
155b0 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 68 69  .}.../* XXX: Thi
155c0 73 20 69 73 20 75 6e 74 65 73 74 65 64 2c 20 61  s is untested, a
155d0 6e 64 20 66 75 72 74 68 65 72 20 49 27 6d 20 6e  nd further I'm n
155e0 6f 74 20 72 65 61 6c 6c 79 20 73 75 72 65 20 69  ot really sure i
155f0 66 20 74 68 69 73 20 69 73 20 63 6f 72 72 65 63  f this is correc
15600 74 2e 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 74  t. */..switch (t
15610 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ype) {...case CK
15620 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70  M_RSA_PKCS:....p
15630 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69  Info->ulMinKeySi
15640 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e  ze = 512;....pIn
15650 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65  fo->ulMaxKeySize
15660 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66   = 8192;....pInf
15670 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48  o->flags = CKF_H
15680 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20  W | CKF_ENCRYPT 
15690 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20  | CKF_DECRYPT | 
156a0 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56  CKF_SIGN | CKF_V
156b0 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b  ERIFY;....break;
156c0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
156d0 58 5f 35 30 39 3a 0a 09 09 09 70 49 6e 66 6f 2d  X_509:....pInfo-
156e0 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20  >ulMinKeySize = 
156f0 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  512;....pInfo->u
15700 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31  lMaxKeySize = 81
15710 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c  92;....pInfo->fl
15720 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43  ags = CKF_HW | C
15730 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46  KF_ENCRYPT | CKF
15740 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53  _DECRYPT | CKF_S
15750 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59  IGN | CKF_VERIFY
15760 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
15770 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f  se CKM_SHA1_RSA_
15780 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e  PKCS:....pInfo->
15790 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35  ulMinKeySize = 5
157a0 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  12;....pInfo->ul
157b0 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39  MaxKeySize = 819
157c0 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  2;....pInfo->fla
157d0 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b  gs = CKF_HW | CK
157e0 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
157f0 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
15800 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
15810 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
15820 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
15830 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
15840 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  rn(CKR_OK);.}../
15850 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
15860 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
15870 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
15880 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
15890 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f  nitToken)(CK_SLO
158a0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
158b0 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
158c0 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
158d0 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
158e0 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a  R_PTR pLabel) {.
158f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15900 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
15910 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
15920 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
15930 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15940 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
15950 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
15960 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
15970 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
15980 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
15990 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
159a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
159b0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
159c0 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
159d0 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
159e0 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
159f0 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
15a00 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
15a10 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
15a20 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
15a30 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
15a40 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
15a50 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53   C_InitPIN)(CK_S
15a60 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
15a70 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43  ession, CK_UTF8C
15a80 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
15a90 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
15aa0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
15ab0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
15ac0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
15ad0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
15ae0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15af0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15b00 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
15b10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
15b20 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
15b30 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
15b40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15b50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15b60 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
15b70 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
15b80 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
15b90 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
15ba0 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
15bb0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
15bc0 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
15bd0 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
15be0 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
15bf0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
15c00 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b  RV, C_SetPIN)(CK
15c10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
15c20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46  hSession, CK_UTF
15c30 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69  8CHAR_PTR pOldPi
15c40 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c  n, CK_ULONG ulOl
15c50 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  dPinLen, CK_UTF8
15c60 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e  CHAR_PTR pNewPin
15c70 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77  , CK_ULONG ulNew
15c80 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  PinLen) {..CACKE
15c90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15ca0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
15cb0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
15cc0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
15cd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
15ce0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
15cf0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
15d00 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
15d10 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
15d20 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
15d30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15d40 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
15d50 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
15d60 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
15d70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
15d80 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
15d90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
15da0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
15db0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
15dc0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e  ON(CK_RV, C_Open
15dd0 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54  Session)(CK_SLOT
15de0 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46  _ID slotID, CK_F
15df0 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56  LAGS flags, CK_V
15e00 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61  OID_PTR pApplica
15e10 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20  tion, CK_NOTIFY 
15e20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49  notify, CK_SESSI
15e30 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  ON_HANDLE_PTR ph
15e40 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69  Session) {..unsi
15e50 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09  gned long idx;..
15e60 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
15e70 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73  ;..int found_ses
15e80 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b  sion = 0;...CACK
15e90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15ea0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
15eb0 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53   ((flags & CKF_S
15ec0 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21  ERIAL_SESSION) !
15ed0 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53  = CKF_SERIAL_SES
15ee0 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e  SION) {...return
15ef0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52  (CKR_SESSION_PAR
15f00 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52  ALLEL_NOT_SUPPOR
15f10 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  TED);..}...if (!
15f20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
15f30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
15f40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
15f50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
15f60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
15f70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
15f80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
15f90 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
15fa0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
15fb0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
15fc0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
15fd0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
15fe0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
15ff0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16000 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
16010 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
16020 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
16030 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
16040 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
16050 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
16060 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
16070 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
16080 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
16090 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
160a0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
160b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
160c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
160d0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
160e0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
160f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
16100 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
16110 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
16120 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
16130 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16140 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16150 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
16160 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
16170 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
16180 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
16190 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
161a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
161b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
161c0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
161d0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
161e0 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
161f0 74 68 65 20 63 61 72 64 20 69 73 20 61 63 74 75  the card is actu
16200 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74  ally in the slot
16210 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68  . */../* XXX: Ch
16220 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
16230 20 74 68 69 73 20 69 73 20 69 6e 20 74 68 65 20   this is in the 
16240 50 4b 43 53 23 31 31 20 73 70 65 63 69 66 69 63  PKCS#11 specific
16250 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61  ation */..if (ca
16260 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
16270 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  nt(&cackey_slots
16280 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43  [slotID]) != CAC
16290 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
162a0 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43  PRESENT) {...CAC
162b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
162c0 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e  ("Error.  Card n
162d0 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74  ot present.  Ret
162e0 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43  urning CKR_DEVIC
162f0 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09  E_REMOVED");....
16300 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
16310 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
16320 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
16330 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
16340 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  D);..}...for (id
16350 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69  x = 1; idx < (si
16360 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
16370 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
16380 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
16390 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
163a0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
163b0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
163c0 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73  ) {....found_ses
163d0 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70  sion = 1;.....*p
163e0 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a  hSession = idx;.
163f0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
16400 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20  ons[idx].active 
16410 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  = 1;....cackey_s
16420 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f  essions[idx].slo
16430 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09  tID = slotID;...
16440 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
16450 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b  [idx].state = CK
16460 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53  S_RO_PUBLIC_SESS
16470 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ION;....cackey_s
16480 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61  essions[idx].fla
16490 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63  gs = flags;....c
164a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
164b0 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f  dx].ulDeviceErro
164c0 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79  r = 0;....cackey
164d0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70  _sessions[idx].p
164e0 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41  Application = pA
164f0 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63  pplication;....c
16500 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
16510 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74  dx].Notify = not
16520 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ify;.....cackey_
16530 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
16540 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
16550 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
16560 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
16570 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a  ies_count = 0;..
16580 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
16590 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61  ns[idx].search_a
165a0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
165b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
165c0 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  dx].sign_active 
165d0 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
165e0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65  sessions[idx].de
165f0 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30  crypt_active = 0
16600 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
16610 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
16620 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
16630 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26  ead_identities(&
16640 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
16650 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65  tID], &cackey_se
16660 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
16670 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
16680 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
16690 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
166a0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
166b0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
166c0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
166d0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
166e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
166f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16700 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
16710 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
16720 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
16730 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f  R);..}...if (!fo
16740 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09  und_session) {..
16750 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16760 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
16770 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
16780 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 53  T (%i)", CKR_SES
16790 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09  SION_COUNT);....
167a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
167b0 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09  ON_COUNT);..}...
167c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
167d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
167e0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
167f0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
16800 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
16810 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
16820 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73  _RV, C_CloseSess
16830 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion)(CK_SESSION_
16840 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
16850 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
16860 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
16870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
16880 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
16890 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
168a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
168b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
168c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
168d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
168e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
168f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
16900 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
16910 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
16920 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
16930 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
16940 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
16950 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
16960 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16970 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
16980 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
16990 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
169a0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
169b0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
169c0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
169d0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
169e0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
169f0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
16a00 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
16a10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16a20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16a30 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
16a40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
16a50 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
16a60 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
16a70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
16a80 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
16a90 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
16aa0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
16ab0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
16ac0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16ad0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
16ae0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
16af0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
16b00 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
16b10 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  VALID);..}...cac
16b20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
16b30 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20  ssion].active = 
16b40 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  0;..cackey_free_
16b50 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65  identities(cacke
16b60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
16b70 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c  ion].identities,
16b80 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
16b90 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
16ba0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
16bb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
16bc0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
16bd0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
16be0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
16bf0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
16c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16c10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
16c20 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
16c30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
16c40 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
16c50 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
16c60 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
16c70 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
16c80 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
16c90 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
16ca0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
16cb0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73  ON(CK_RV, C_Clos
16cc0 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b  eAllSessions)(CK
16cd0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29  _SLOT_ID slotID)
16ce0 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
16cf0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
16d00 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
16d10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
16d20 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
16d30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
16d40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
16d50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
16d60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
16d70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
16d80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
16d90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
16da0 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
16db0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
16dc0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
16dd0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
16de0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
16df0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
16e00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16e10 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
16e20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
16e30 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
16e40 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
16e50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
16e60 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
16e70 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
16e80 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
16e90 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
16ea0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
16eb0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
16ec0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
16ed0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
16ee0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
16ef0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
16f00 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
16f10 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
16f20 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
16f30 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
16f40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16f50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
16f60 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
16f70 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
16f80 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
16f90 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
16fa0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
16fb0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
16fc0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
16fd0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
16fe0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66  INVALID);..}...f
16ff0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
17000 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
17010 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
17020 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
17030 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
17040 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
17050 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
17060 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28  ctive) {....if (
17070 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
17080 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73  idx].slotID != s
17090 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e  lotID) {.....con
170a0 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
170b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
170c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
170d0 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53  ck);....C_CloseS
170e0 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09  ession(idx);....
170f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
17100 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
17110 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
17120 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
17130 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
17140 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
17150 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
17160 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
17170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17180 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
17190 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
171a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
171b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
171c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
171d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
171e0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
171f0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
17200 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
17210 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
17220 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69  K_RV, C_GetSessi
17230 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49  onInfo)(CK_SESSI
17240 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
17250 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49  on, CK_SESSION_I
17260 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
17270 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
17280 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
17290 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
172a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
172b0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
172c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
172d0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
172e0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
172f0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
17300 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
17310 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
17320 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
17330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17340 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
17350 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
17360 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
17370 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
17380 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
17390 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
173a0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
173b0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
173c0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
173d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
173e0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
173f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17400 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
17410 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
17420 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
17430 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
17440 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
17450 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
17460 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
17470 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
17480 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
17490 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
174a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
174b0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
174c0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
174d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
174e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
174f0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
17500 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
17510 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
17520 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
17530 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
17540 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17550 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
17560 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
17570 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
17580 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
17590 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
175a0 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44  ...pInfo->slotID
175b0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
175c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
175d0 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61  tID;..pInfo->sta
175e0 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  te = cackey_sess
175f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
17600 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c  tate;..pInfo->fl
17610 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ags = cackey_ses
17620 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
17630 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75  flags;..pInfo->u
17640 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63  lDeviceError = c
17650 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
17660 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63  Session].ulDevic
17670 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f  eError;...mutex_
17680 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
17690 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
176a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
176b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
176c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
176d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
176e0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
176f0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
17700 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
17710 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
17720 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17730 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
17740 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
17750 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
17760 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
17770 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
17780 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69  RV, C_GetOperati
17790 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53  onState)(CK_SESS
177a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
177b0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
177c0 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65   pOperationState
177d0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
177e0 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  ulOperationState
177f0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
17800 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
17810 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
17820 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
17830 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
17840 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17850 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
17860 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
17870 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
17880 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
17890 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
178a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
178b0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
178c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
178d0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
178e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
178f0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
17900 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
17910 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
17920 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
17930 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72  CK_RV, C_SetOper
17940 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
17950 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
17960 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
17970 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
17980 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
17990 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65  OperationStateLe
179a0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
179b0 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b  DLE hEncryptionK
179c0 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  ey, CK_OBJECT_HA
179d0 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61  NDLE hAuthentica
179e0 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b  tionKey) {..CACK
179f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17a00 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
17a10 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
17a20 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
17a30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17a40 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
17a50 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
17a60 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
17a70 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
17a80 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
17a90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17aa0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
17ab0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
17ac0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
17ad0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
17ae0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
17af0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
17b00 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
17b10 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
17b20 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67  ION(CK_RV, C_Log
17b30 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  in)(CK_SESSION_H
17b40 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
17b50 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65  CK_USER_TYPE use
17b60 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48  rType, CK_UTF8CH
17b70 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
17b80 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20  ULONG ulPinLen) 
17b90 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
17ba0 76 61 6c 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f  val;..int login_
17bb0 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
17bc0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
17bd0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
17be0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
17bf0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17c00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17c10 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
17c20 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
17c30 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
17c40 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
17c50 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
17c60 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
17c70 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
17c80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
17c90 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
17ca0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
17cb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17cc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
17cd0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
17ce0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
17cf0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
17d00 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
17d10 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79  ..}...if (userTy
17d20 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20  pe != CKU_USER) 
17d30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17d40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17d50 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
17d60 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65   USER mode, aske
17d70 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22  d for %lu mode."
17d80 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17d90 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72  ) userType)....r
17da0 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54  eturn(CKR_USER_T
17db0 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  YPE_INVALID);..}
17dc0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
17dd0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
17de0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
17df0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
17e00 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
17e10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17e20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
17e30 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
17e40 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
17e50 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
17e60 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
17e70 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
17e80 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
17e90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
17ea0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
17eb0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
17ec0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17ed0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
17ee0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
17ef0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
17f00 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
17f10 44 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72  D);..}...login_r
17f20 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69  et = cackey_logi
17f30 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  n(&cackey_slots[
17f40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
17f50 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
17f60 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65  ], pPin, ulPinLe
17f70 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6c  n, NULL);..if (l
17f80 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  ogin_ret != CACK
17f90 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
17fa0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
17fb0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
17fc0 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c 6f  lock);....if (lo
17fd0 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
17fe0 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29  Y_PCSC_E_LOCKED)
17ff0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
18000 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18010 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b  .  Token is lock
18020 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ed.");.....retur
18030 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  n(CKR_PIN_LOCKED
18040 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28  );...} else if (
18050 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43  login_ret == CAC
18060 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
18070 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  N) {....CACKEY_D
18080 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18090 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e  or.  Invalid PIN
180a0 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
180b0 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
180c0 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  T);...}....CACKE
180d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
180e0 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20  Error.  Unknown 
180f0 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66  error returned f
18100 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  rom cackey_login
18110 28 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f  () (%i)", login_
18120 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
18130 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
18140 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  R);..}...cackey_
18150 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
18160 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  n].state = CKS_R
18170 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53  O_USER_FUNCTIONS
18180 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
18190 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
181a0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
181b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
181c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
181d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
181e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
181f0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
18200 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
18210 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
18220 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
18230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18240 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
18250 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
18260 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
18270 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
18280 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
18290 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49  Logout)(CK_SESSI
182a0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
182b0 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  on) {..int mutex
182c0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
182d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
182e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
182f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
18300 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
18310 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18320 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
18330 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
18340 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
18350 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
18360 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
18370 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
18380 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
18390 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
183a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
183b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
183c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
183d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
183e0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
183f0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
18400 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
18410 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
18420 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
18430 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
18440 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
18450 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
18460 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
18470 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
18480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18490 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
184a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
184b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
184c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
184d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
184e0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
184f0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
18500 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
18510 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
18520 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18530 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
18540 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
18550 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
18560 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
18570 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
18580 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18590 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20  hSession].state 
185a0 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f  = CKS_RO_PUBLIC_
185b0 53 45 53 53 49 4f 4e 3b 0a 0a 09 6d 75 74 65 78  SESSION;...mutex
185c0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
185d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
185e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
185f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
18600 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
18610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18620 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
18630 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
18640 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
18650 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
18660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18670 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
18680 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
18690 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
186a0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
186b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
186c0 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a  _RV, C_CreateObj
186d0 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
186e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
186f0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
18700 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
18710 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
18720 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
18730 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a  PTR phObject) {.
18740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18750 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
18760 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
18770 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
18780 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18790 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
187a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
187b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
187c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
187d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
187e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
187f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
18800 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
18810 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
18820 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
18830 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
18840 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
18850 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
18860 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
18870 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
18880 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b  C_CopyObject)(CK
18890 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
188a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
188b0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
188c0 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ct, CK_ATTRIBUTE
188d0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
188e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
188f0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
18900 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65  LE_PTR phNewObje
18910 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
18920 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
18930 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
18940 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
18950 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
18960 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18970 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
18980 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18990 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
189a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
189b0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
189c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
189d0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
189e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
189f0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
18a00 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
18a10 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
18a20 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
18a30 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
18a40 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
18a50 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f  K_RV, C_DestroyO
18a60 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
18a70 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
18a80 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
18a90 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09  DLE hObject) {..
18aa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18ab0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
18ac0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
18ad0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
18ae0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18af0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
18b00 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
18b10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
18b20 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
18b30 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
18b40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18b50 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
18b60 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
18b70 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
18b80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
18b90 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
18ba0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
18bb0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
18bc0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
18bd0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
18be0 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28  _GetObjectSize)(
18bf0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
18c00 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
18c10 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
18c20 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ject, CK_ULONG_P
18c30 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43  TR pulSize) {..C
18c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18c50 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
18c60 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
18c70 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
18c80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18c90 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
18ca0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
18cb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
18cc0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
18cd0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
18ce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18cf0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
18d00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
18d10 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
18d20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
18d30 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
18d40 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
18d50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
18d60 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
18d70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
18d80 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
18d90 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
18da0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
18db0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
18dc0 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
18dd0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
18de0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
18df0 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54  Count) {..CK_ATT
18e00 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
18e10 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  r;..struct cacke
18e20 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
18e30 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20  tity;..unsigned 
18e40 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64  long identity_id
18e50 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73  x, attr_idx, ses
18e60 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f  s_attr_idx, num_
18e70 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ids;..int mutex_
18e80 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72  retval;..CK_RV r
18e90 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
18ea0 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61  .CK_VOID_PTR pVa
18eb0 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  lue;..CK_ULONG u
18ec0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43  lValueLen;...CAC
18ed0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18ee0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
18ef0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
18f00 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
18f10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18f20 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
18f30 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
18f40 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
18f50 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
18f60 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
18f70 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
18f80 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
18f90 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
18fa0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
18fb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
18fc0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
18fd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18fe0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
18ff0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
19000 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
19010 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
19020 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
19030 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a  hObject == 0) {.
19040 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19050 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f  RINTF("Error.  O
19060 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74  bject handle out
19070 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
19080 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42  ...return(CKR_OB
19090 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  JECT_HANDLE_INVA
190a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  LID);..}...if (u
190b0 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  lCount == 0) {..
190c0 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
190d0 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63  t, if zero objec
190e0 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ts were specifie
190f0 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74  d return zero it
19100 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ems immediately 
19110 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
19120 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
19130 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
19140 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
19150 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
19160 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
19170 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
19180 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
19190 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
191a0 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70  F("Error.  pTemp
191b0 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  late is NULL.");
191c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
191d0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
191e0 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78  }...identity_idx
191f0 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a   = hObject - 1;.
19200 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
19210 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
19220 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
19230 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
19240 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
19250 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19260 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
19270 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
19280 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
19290 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
192a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
192b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
192c0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
192d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
192e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
192f0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
19300 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19310 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
19320 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
19330 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
19340 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
19350 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20  );..}...num_ids 
19360 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
19370 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
19380 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09  tities_count;...
19390 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78  if (identity_idx
193a0 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09   >= num_ids) {..
193b0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
193c0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
193d0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
193e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
193f0 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e  ror.  Object han
19400 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
19410 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20  .  identity_idx 
19420 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d  = %lu, num_ids =
19430 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65   %lu.", (unsigne
19440 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79  d long) identity
19450 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  _idx, (unsigned 
19460 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a  long) num_ids);.
19470 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42  ...return(CKR_OB
19480 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  JECT_HANDLE_INVA
19490 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74  LID);..}...ident
194a0 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ity = &cackey_se
194b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
194c0 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e  .identities[iden
194d0 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72  tity_idx];...for
194e0 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20   (attr_idx = 0; 
194f0 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75  attr_idx < ulCou
19500 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20  nt; attr_idx++) 
19510 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  {...curr_attr = 
19520 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f  &pTemplate[attr_
19530 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20  idx];....pValue 
19540 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75  = NULL;...ulValu
19550 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
19560 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44   -1;....CACKEY_D
19570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f  EBUG_PRINTF("Loo
19580 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75  king for attribu
19590 74 65 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e  te 0x%08lx (iden
195a0 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20  tity:%lu) ...", 
195b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
195c0 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c  curr_attr->type,
195d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
195e0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a   identity_idx);.
195f0 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74  ...for (sess_att
19600 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f  r_idx = 0; sess_
19610 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74  attr_idx < ident
19620 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f  ity->attributes_
19630 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72  count; sess_attr
19640 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20  _idx++) {....if 
19650 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69  (identity->attri
19660 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
19670 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72  idx].type == cur
19680 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a  r_attr->type) {.
19690 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
196a0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f  _PRINTF(" ... fo
196b0 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d  und it, pValue =
196c0 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20   %p, ulValueLen 
196d0 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79  = %lu", identity
196e0 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
196f0 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c  s_attr_idx].pVal
19700 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  ue, identity->at
19710 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
19720 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  tr_idx].ulValueL
19730 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56  en);..........pV
19740 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  alue = identity-
19750 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
19760 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75  _attr_idx].pValu
19770 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
19780 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  n = identity->at
19790 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
197a0 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  tr_idx].ulValueL
197b0 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  en;....}...}....
197c0 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
197d0 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29  Value && pValue)
197e0 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61   {....if (curr_a
197f0 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  ttr->ulValueLen 
19800 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  >= ulValueLen) {
19810 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
19820 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70  _attr->pValue, p
19830 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65  Value, ulValueLe
19840 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  n);....} else {.
19850 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
19860 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a   (CK_LONG) -1;..
19870 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
19880 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
19890 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  L;....}...}....c
198a0 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
198b0 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65  eLen = ulValueLe
198c0 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  n;..}...mutex_re
198d0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
198e0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
198f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
19900 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
19910 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
19920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19930 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
19940 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
19950 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
19960 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
19970 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41  (retval == CKR_A
19980 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e  TTRIBUTE_TYPE_IN
19990 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45  VALID) {...CACKE
199a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
199b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54  Returning CKR_AT
199c0 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56  TRIBUTE_TYPE_INV
199d0 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74  ALID (%i)", (int
199e0 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
199f0 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
19a00 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
19a10 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45  SMALL) {...CACKE
19a20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19a30 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55  Returning CKR_BU
19a40 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28  FFER_TOO_SMALL (
19a50 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
19a60 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  al);..} else if 
19a70 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f  (retval == CKR_O
19a80 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
19a90 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
19aa0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
19ab0 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
19ac0 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43  );..} else {...C
19ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19ae0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69  TF("Returning %i
19af0 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
19b00 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
19b10 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  tval);.}..CK_DEF
19b20 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
19b30 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75  RV, C_SetAttribu
19b40 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
19b50 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
19b60 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
19b70 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
19b80 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
19b90 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
19ba0 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
19bb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19bc0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
19bd0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
19be0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
19bf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19c00 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
19c10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
19c20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
19c30 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
19c40 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
19c50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19c60 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
19c70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
19c80 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
19c90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
19ca0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
19cb0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
19cc0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
19cd0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
19ce0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
19cf0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
19d00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
19d10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
19d20 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
19d30 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
19d40 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69  NG ulCount) {..i
19d50 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
19d60 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19d70 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
19d80 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
19d90 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
19da0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19db0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
19dc0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
19dd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
19de0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
19df0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
19e00 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
19e10 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
19e20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
19e30 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
19e40 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
19e50 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
19e60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19e70 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
19e80 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
19e90 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
19ea0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
19eb0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
19ec0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
19ed0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
19ee0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
19ef0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
19f00 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
19f10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19f20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
19f30 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
19f40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
19f50 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
19f60 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
19f70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
19f80 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
19f90 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
19fa0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
19fb0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
19fc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19fd0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
19fe0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
19ff0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1a000 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1a010 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1a020 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a030 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
1a040 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1a050 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1a060 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1a070 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a080 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1a090 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74  arch already act
1a0a0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1a0b0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
1a0c0 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
1a0d0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1a0e0 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  [cackey_sessions
1a0f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
1a100 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  D].slot_reset) {
1a110 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a120 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74  PRINTF("The slot
1a130 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74 20   has been reset 
1a140 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f  since we last lo
1a150 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74  oked for identit
1a160 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e  ies -- rescannin
1a170 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  g");....if (cack
1a180 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a190 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1a1a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63   != NULL) {....c
1a1b0 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74  ackey_free_ident
1a1c0 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73  ities(cackey_ses
1a1d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1a1e0 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b  identities, cack
1a1f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a200 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1a210 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63  _count);.....cac
1a220 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1a230 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1a240 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63  s = NULL;....cac
1a250 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1a260 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1a270 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d  s_count = 0;...}
1a280 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1a290 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  [cackey_sessions
1a2a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
1a2b0 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  D].slot_reset = 
1a2c0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  0;..}...if (cack
1a2d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a2e0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1a2f0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   == NULL) {...ca
1a300 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1a310 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1a320 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
1a330 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
1a340 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79  key_slots[cackey
1a350 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1a360 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 26 63 61  on].slotID], &ca
1a370 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1a380 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1a390 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09  es_count);..}...
1a3a0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d  if (pTemplate !=
1a3b0 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75   NULL) {...if (u
1a3c0 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
1a3d0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1a3e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1a3f0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
1a400 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63   ulCount;....cac
1a410 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1a420 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1a430 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43  ery = malloc(ulC
1a440 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
1a450 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09  Template));.....
1a460 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
1a470 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1a480 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70  .search_query, p
1a490 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e  Template, ulCoun
1a4a0 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
1a4b0 70 6c 61 74 65 29 29 3b 0a 09 09 7d 20 65 6c 73  plate));...} els
1a4c0 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  e {....cackey_se
1a4d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1a4e0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
1a4f0 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  unt = 0;....cack
1a500 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a510 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1a520 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ry = NULL;...}..
1a530 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75  } else {...if (u
1a540 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
1a550 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1a560 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1a570 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45  lock);.....CACKE
1a580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a590 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71  Error.  Search q
1a5a0 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61  uery specified a
1a5b0 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62  s NULL, but numb
1a5c0 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d  er of query term
1a5d0 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  s not specified 
1a5e0 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74  as 0.");.....ret
1a5f0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1a600 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63  S_BAD);...}....c
1a610 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a620 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1a630 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b  query_count = 0;
1a640 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1a650 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1a660 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
1a670 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
1a680 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1a690 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
1a6a0 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   1;..cackey_sess
1a6b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1a6c0 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20  earch_curr_id = 
1a6d0 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  0;...mutex_retva
1a6e0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1a6f0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1a700 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1a710 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1a720 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a730 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a740 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1a750 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1a760 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1a770 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
1a780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1a790 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1a7a0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1a7b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1a7c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1a7d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1a7e0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b  _FindObjects)(CK
1a7f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1a800 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
1a810 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
1a820 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e  hObject, CK_ULON
1a830 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  G ulMaxObjectCou
1a840 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  nt, CK_ULONG_PTR
1a850 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29   pulObjectCount)
1a860 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
1a870 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72  y_identity *curr
1a880 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  _id;..CK_ATTRIBU
1a890 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
1a8a0 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64  CK_ULONG curr_id
1a8b0 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69  _idx, curr_out_i
1a8c0 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72  d_idx, curr_attr
1a8d0 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f  _idx, sess_attr_
1a8e0 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d  idx;..CK_ULONG m
1a8f0 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72  atched_count, pr
1a900 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ev_matched_count
1a910 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1a920 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1a930 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1a940 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1a950 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1a960 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a970 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a980 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1a990 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1a9a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1a9b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1a9c0 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65  .}...if (pulObje
1a9d0 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ctCount == NULL)
1a9e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a9f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1aa00 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74    pulObjectCount
1aa10 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1aa20 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1aa30 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1aa40 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20  if (phObject == 
1aa50 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a  NULL && ulMaxObj
1aa60 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  ectCount == 0) {
1aa70 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
1aa80 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a  uit, if zero obj
1aa90 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66  ects were specif
1aaa0 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20  ied return zero 
1aab0 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c  items immediatel
1aac0 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63  y */...*pulObjec
1aad0 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43  tCount = 0;....C
1aae0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1aaf0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1ab00 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
1ab10 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
1ab20 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
1ab30 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
1ab40 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c  (phObject == NUL
1ab50 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1ab60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ab70 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20  r.  phObject is 
1ab80 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1ab90 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1aba0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1abb0 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
1abc0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1abd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1abe0 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20  Error.  Maximum 
1abf0 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  number of object
1ac00 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a  s specified as z
1ac10 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ero.");....retur
1ac20 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1ac30 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  BAD);..}...if (h
1ac40 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1ac50 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1ac60 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1ac70 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1ac80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1ac90 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1aca0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1acb0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1acc0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1acd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1ace0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1acf0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1ad00 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1ad10 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1ad20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1ad30 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1ad40 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1ad50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ad60 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1ad70 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1ad80 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1ad90 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1ada0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1adb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1adc0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1add0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1ade0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1adf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ae00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1ae10 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1ae20 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1ae30 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1ae40 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1ae50 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1ae60 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ae70 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
1ae80 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1ae90 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1aea0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1aeb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1aec0 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
1aed0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1aee0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1aef0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
1af00 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1af10 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20  curr_out_id_idx 
1af20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f  = 0;..for (curr_
1af30 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f  id_idx = cackey_
1af40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1af50 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
1af60 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c  d; curr_id_idx <
1af70 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1af80 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1af90 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75  ities_count && u
1afa0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b  lMaxObjectCount;
1afb0 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20   curr_id_idx++) 
1afc0 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63  {...curr_id = &c
1afd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1afe0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1aff0 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d  ies[curr_id_idx]
1b000 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1b010 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73  G_PRINTF("Proces
1b020 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c  sing identity:%l
1b030 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
1b040 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  ng) curr_id_idx)
1b050 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75  ;....matched_cou
1b060 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28  nt = 0;....for (
1b070 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20  curr_attr_idx = 
1b080 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78  0; curr_attr_idx
1b090 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   < cackey_sessio
1b0a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1b0b0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b  rch_query_count;
1b0c0 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b   curr_attr_idx++
1b0d0 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63  ) {....prev_matc
1b0e0 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63  hed_count = matc
1b0f0 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63  hed_count;.....c
1b100 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b  urr_attr = &cack
1b110 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1b120 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1b130 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78  ry[curr_attr_idx
1b140 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ];.....CACKEY_DE
1b150 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68  BUG_PRINTF("  Ch
1b160 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69  ecking for attri
1b170 62 75 74 65 20 30 78 25 30 38 6c 78 20 69 6e 20  bute 0x%08lx in 
1b180 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c  identity:%i...",
1b190 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b1a0 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65   curr_attr->type
1b1b0 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f  , (int) curr_id_
1b1c0 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  idx);....CACKEY_
1b1d0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
1b1e0 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e      Value lookin
1b1f0 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74  g for:", curr_at
1b200 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72  tr->pValue, curr
1b210 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
1b220 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73  n);.....for (ses
1b230 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  s_attr_idx = 0; 
1b240 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20  sess_attr_idx < 
1b250 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
1b260 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f  tes_count; sess_
1b270 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
1b280 09 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e 61  ..if (curr_id->a
1b290 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
1b2a0 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d  ttr_idx].type ==
1b2b0 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65   curr_attr->type
1b2c0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1b2d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
1b2e0 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63    ... found matc
1b2f0 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b  hing type ...");
1b300 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b310 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
1b320 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22   ... our value:"
1b330 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  , curr_id->attri
1b340 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
1b350 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72  idx].pValue, cur
1b360 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
1b370 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
1b380 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1b390 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
1b3a0 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c  ->pValue == NULL
1b3b0 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
1b3c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b3d0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
1b3e0 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29  wildcard match")
1b3f0 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68 65 64  ;........matched
1b400 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09  _count++;.......
1b410 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
1b420 20 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 61   .....if (curr_a
1b430 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  ttr->ulValueLen 
1b440 3d 3d 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  == curr_id->attr
1b450 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
1b460 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
1b470 20 26 26 20 6d 65 6d 63 6d 70 28 63 75 72 72 5f   && memcmp(curr_
1b480 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75  attr->pValue, cu
1b490 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
1b4a0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
1b4b0 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64  .pValue, curr_id
1b4c0 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
1b4d0 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61  s_attr_idx].ulVa
1b4e0 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a  lueLen) == 0) {.
1b4f0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b500 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
1b510 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63    ... found exac
1b520 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09  t match");......
1b530 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b  ..matched_count+
1b540 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  +;........break;
1b550 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
1b560 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65  .}...../* If the
1b570 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64   attribute could
1b580 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c   not be matched,
1b590 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d   do not try to m
1b5a0 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20  atch additional 
1b5b0 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09  attributes */...
1b5c0 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65  .if (prev_matche
1b5d0 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68  d_count == match
1b5e0 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  ed_count) {.....
1b5f0 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  break;....}...}.
1b600 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63  ...if (matched_c
1b610 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73  ount == cackey_s
1b620 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b630 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
1b640 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
1b650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b660 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74    ... All %i att
1b670 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
1b680 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e  for found, addin
1b690 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f  g identity:%i to
1b6a0 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c   returned list",
1b6b0 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65   (int) cackey_se
1b6c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1b6d0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
1b6e0 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
1b6f0 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f  id_idx);.....phO
1b700 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69  bject[curr_out_i
1b710 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64  d_idx] = curr_id
1b720 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c  _idx + 1;.....ul
1b730 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d  MaxObjectCount--
1b740 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69  ;.....curr_out_i
1b750 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73  d_idx++;...} els
1b760 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
1b770 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
1b780 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e  . Not all %i (on
1b790 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74  ly found %i) att
1b7a0 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
1b7b0 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61  for found, not a
1b7c0 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
1b7d0 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  i", (int) cackey
1b7e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1b7f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1b800 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61  _count, (int) ma
1b810 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e  tched_count, (in
1b820 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
1b830 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f  ...}..}..cackey_
1b840 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1b850 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
1b860 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b  d = curr_id_idx;
1b870 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ..*pulObjectCoun
1b880 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f  t = curr_out_id_
1b890 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  idx;...mutex_ret
1b8a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1b8b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1b8c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1b8d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1b8e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1b8f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b900 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1b910 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1b920 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1b930 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1b940 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b950 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1b960 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65  K (%i), num obje
1b970 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f  cts = %lu", CKR_
1b980 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  OK, *pulObjectCo
1b990 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  unt);...return(C
1b9a0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1b9b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1b9c0 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
1b9d0 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  tsFinal)(CK_SESS
1b9e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1b9f0 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  ion) {..int mute
1ba00 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
1ba10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ba20 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1ba30 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1ba40 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1ba50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ba60 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1ba70 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1ba80 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1ba90 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1baa0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
1bab0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
1bac0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
1bad0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1bae0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1baf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1bb00 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1bb10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1bb20 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
1bb30 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
1bb40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1bb50 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1bb60 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1bb70 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1bb80 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1bb90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1bba0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1bbb0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1bbc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1bbd0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1bbe0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1bbf0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1bc00 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1bc10 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1bc20 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1bc30 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1bc40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1bc50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1bc60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bc70 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1bc80 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1bc90 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1bca0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1bcb0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1bcc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1bcd0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1bce0 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
1bcf0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1bd00 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1bd10 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1bd20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bd30 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
1bd40 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1bd50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
1bd60 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
1bd70 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63  IALIZED);..}...c
1bd80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1bd90 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1bda0 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 69 66 20  active = 0;..if 
1bdb0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1bdc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1bdd0 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65  h_query) {...fre
1bde0 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
1bdf0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1be00 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09  ch_query);..}...
1be10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1be20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1be30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1be40 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1be50 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1be60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1be70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1be80 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1be90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1bea0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1beb0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1bec0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1bed0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1bee0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1bef0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1bf00 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1bf10 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
1bf20 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
1bf30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1bf40 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
1bf50 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
1bf60 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1bf70 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
1bf80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bf90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1bfa0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1bfb0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1bfc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bfd0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1bfe0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1bff0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1c000 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1c010 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1c020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1c030 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1c040 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1c050 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1c060 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1c070 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1c080 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1c090 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1c0a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1c0b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
1c0c0 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rypt)(CK_SESSION
1c0d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1c0e0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
1c0f0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
1c100 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
1c110 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
1c120 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
1c130 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61  R pulEncryptedDa
1c140 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  taLen) {..CACKEY
1c150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1c160 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1c170 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1c180 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1c190 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c1a0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1c1b0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1c1c0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1c1d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1c1e0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1c1f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1c200 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1c210 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1c220 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1c230 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1c240 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1c250 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1c260 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1c270 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1c280 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
1c290 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
1c2a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1c2b0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1c2c0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
1c2d0 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
1c2e0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
1c2f0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
1c300 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
1c310 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
1c320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c330 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1c340 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1c350 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1c360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c370 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1c380 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1c390 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1c3a0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1c3b0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1c3c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c3d0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1c3e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1c3f0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1c400 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1c410 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1c420 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1c430 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1c440 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1c450 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
1c460 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ncryptFinal)(CK_
1c470 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1c480 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1c490 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70  _PTR pLastEncryp
1c4a0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
1c4b0 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63  G_PTR pulLastEnc
1c4c0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
1c4d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c4e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1c4f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1c500 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1c510 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c520 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1c530 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1c540 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c550 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1c560 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1c570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c580 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1c590 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1c5a0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1c5b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1c5c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1c5d0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1c5e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1c5f0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1c600 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1c610 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28   C_DecryptInit)(
1c620 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1c630 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
1c640 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
1c650 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
1c660 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
1c670 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
1c680 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a  val;...hKey--;..
1c690 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c6a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1c6b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1c6c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1c6d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c6e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1c6f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1c700 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1c710 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1c720 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1c730 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d  f (pMechanism ==
1c740 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1c750 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c760 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
1c770 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  m is NULL.");...
1c780 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1c790 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1c7a0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d  .if (pMechanism-
1c7b0 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b  >mechanism != CK
1c7c0 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09  M_RSA_PKCS) {...
1c7d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c7e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
1c7f0 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
1c800 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  m not specified 
1c810 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22  as CKM_RSA_PKCS"
1c820 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c830 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
1c840 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1c850 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1c860 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1c870 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1c880 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1c890 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1c8a0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1c8b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c8c0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1c8d0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1c8e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1c8f0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1c900 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1c910 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1c920 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1c930 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1c940 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1c950 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...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 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1c980 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1c990 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1c9a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1c9b0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1c9c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1c9d0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1c9e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1c9f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1ca00 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1ca10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ca20 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1ca30 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1ca40 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1ca50 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1ca60 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1ca70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1ca80 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
1ca90 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1caa0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1cab0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1cac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cad0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
1cae0 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e  crypt already in
1caf0 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09   progress.");...
1cb00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
1cb10 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
1cb20 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e  ..}...if (hKey >
1cb30 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
1cb40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1cb50 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
1cb60 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1cb70 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1cb80 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1cb90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1cba0 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c  rror.  Key handl
1cbb0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28  e out of range (
1cbc0 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c  requested key %l
1cbd0 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e  u, only %lu iden
1cbe0 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65  tities available
1cbf0 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
1cc00 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69  ong) hKey, (unsi
1cc10 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65  gned long) cacke
1cc20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1cc30 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
1cc40 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
1cc50 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45  n(CKR_KEY_HANDLE
1cc60 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1cc70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1cc80 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
1cc90 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09  t_active = 1;...
1cca0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ccb0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
1ccc0 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d  t_mechanism = pM
1ccd0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
1cce0 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ism;..cackey_ses
1ccf0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1cd00 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
1cd10 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  m = pMechanism->
1cd20 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63  pParameter;..cac
1cd30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1cd40 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
1cd50 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d  ech_parmlen = pM
1cd60 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61  echanism->ulPara
1cd70 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65  meterLen;..cacke
1cd80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1cd90 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
1cda0 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
1cdb0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1cdc0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
1cdd0 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ey];...mutex_ret
1cde0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1cdf0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ce00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ce10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1ce20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ce30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ce40 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1ce50 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ce60 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ce70 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1ce80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ce90 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1cea0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1ceb0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1cec0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1ced0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1cee0 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53   C_Decrypt)(CK_S
1cef0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1cf00 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1cf10 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
1cf20 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  ta, CK_ULONG ulE
1cf30 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c  ncryptedDataLen,
1cf40 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
1cf50 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
1cf60 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09   pulDataLen) {..
1cf70 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e  CK_ULONG datalen
1cf80 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e  _update, datalen
1cf90 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64  _final;..CK_RV d
1cfa0 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a 09 43 41  ecrypt_ret;...CA
1cfb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cfc0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1cfd0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1cfe0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1cff0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d000 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1d010 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1d020 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1d030 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1d040 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1d050 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55  pulDataLen == NU
1d060 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1d070 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d080 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69  or. pulDataLen i
1d090 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1d0a0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1d0b0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61  TS_BAD);..}...da
1d0c0 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a  talen_update = *
1d0d0 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65  pulDataLen;...de
1d0e0 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65  crypt_ret = C_De
1d0f0 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65 73  cryptUpdate(hSes
1d100 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64  sion, pEncrypted
1d110 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65  Data, ulEncrypte
1d120 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c  dDataLen, pData,
1d130 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65   &datalen_update
1d140 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f  );..if (decrypt_
1d150 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
1d160 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d170 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d180 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29 20  DecryptUpdate() 
1d190 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
1d1a0 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
1d1b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
1d1c0 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09  ecrypt_ret);....
1d1d0 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72  return(decrypt_r
1d1e0 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44  et);..}...if (pD
1d1f0 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b  ata) {...pData +
1d200 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  = datalen_update
1d210 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69  ;..}..datalen_fi
1d220 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65  nal = *pulDataLe
1d230 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  n - datalen_upda
1d240 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65  te;...decrypt_re
1d250 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e  t = C_DecryptFin
1d260 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  al(hSession, pDa
1d270 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e  ta, &datalen_fin
1d280 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  al);..if (decryp
1d290 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
1d2a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d2b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d2c0 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29    DecryptFinal()
1d2d0 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
1d2e0 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
1d2f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1d300 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
1d310 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
1d320 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44  ret);..}...*pulD
1d330 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e  ataLen = datalen
1d340 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65  _update + datale
1d350 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45  n_final;...CACKE
1d360 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d370 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1d380 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1d390 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1d3a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d3b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d3c0 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 29  C_DecryptUpdate)
1d3d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1d3e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1d3f0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
1d400 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
1d410 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
1d420 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
1d430 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
1d440 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
1d450 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
1d460 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a  YTE buf[16384];.
1d470 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b  .ssize_t buflen;
1d480 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
1d490 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
1d4a0 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  OR;..int mutex_r
1d4b0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
1d4c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1d4d0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1d4e0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1d4f0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1d500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d510 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1d520 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1d530 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1d540 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1d550 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
1d560 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
1d570 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
1d580 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1d590 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1d5a0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
1d5b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d5c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d5d0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
1d5e0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
1d5f0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1d600 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1d610 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63  );..}...if (pEnc
1d620 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55  ryptedPart == NU
1d630 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65  LL && ulEncrypte
1d640 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  dPartLen == 0) {
1d650 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
1d660 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
1d670 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e  ked to decrypt n
1d680 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43  othing... */...C
1d690 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d6a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1d6b0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
1d6c0 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
1d6d0 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
1d6e0 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
1d6f0 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20  (pEncryptedPart 
1d700 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1d710 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d720 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70  ("Error. pEncryp
1d730 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c  tedPart is NULL,
1d740 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64   but ulEncrypted
1d750 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30  PartLen is not 0
1d760 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1d770 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1d780 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e  );..}...if (ulEn
1d790 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d  cryptedPartLen =
1d7a0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1d7b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d7c0 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64  ror. ulEncrypted
1d7d0 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
1d7e0 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
1d7f0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1d800 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1d810 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
1d820 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c  ulPartLen == NUL
1d830 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1d840 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d850 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73  r. pulPartLen is
1d860 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1d870 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1d880 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
1d890 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1d8a0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1d8b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1d8c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1d8d0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1d8e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d8f0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1d900 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1d910 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1d920 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1d930 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1d940 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1d950 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1d960 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1d970 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1d980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d990 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1d9a0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
1d9b0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1d9c0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1d9d0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1d9e0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1d9f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1da00 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
1da10 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1da20 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1da30 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1da40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1da50 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
1da60 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
1da70 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1da80 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
1da90 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1daa0 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
1dab0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1dac0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
1dad0 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
1dae0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
1daf0 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f  ../* Ask card to
1db00 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 62   decrypt */....b
1db10 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73  uflen = cackey_s
1db20 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b  igndecrypt(&cack
1db30 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f  ey_slots[cackey_
1db40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1db50 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  n].slotID], cack
1db60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1db70 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64  sion].decrypt_id
1db80 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74  entity, pEncrypt
1db90 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70  edPart, ulEncryp
1dba0 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c  tedPartLen, buf,
1dbb0 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 0a   sizeof(buf));..
1dbc0 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20  ...if (buflen < 
1dbd0 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72  0) {...../* Decr
1dbe0 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a  yption failed. *
1dbf0 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  /.....retval = C
1dc00 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1dc10 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  ;....} else if (
1dc20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
1dc30 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50   buflen) > *pulP
1dc40 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29  artLen && pPart)
1dc50 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
1dc60 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ted data too lar
1dc70 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c  ge */.....retval
1dc80 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
1dc90 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c  O_SMALL;....} el
1dca0 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61  se {.....if (pPa
1dcb0 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  rt) {......memcp
1dcc0 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75  y(pPart, buf, bu
1dcd0 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  flen);.....}....
1dce0 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20  ..*pulPartLen = 
1dcf0 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
1dd00 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
1dd10 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
1dd20 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1dd30 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1dd40 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1dd50 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1dd60 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1dd70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1dd80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1dd90 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1dda0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1ddb0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1ddc0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1ddd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1dde0 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
1ddf0 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
1de00 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
1de10 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1de20 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
1de30 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
1de40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1de50 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1de60 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f  R pLastPart, CK_
1de70 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73  ULONG_PTR pulLas
1de80 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74  tPartLen) {..int
1de90 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1dea0 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65  int terminate_de
1deb0 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43  crypt = 1;...CAC
1dec0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ded0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1dee0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1def0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1df00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1df10 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1df20 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1df30 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1df40 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1df50 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
1df60 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1df70 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1df80 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1df90 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1dfa0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1dfb0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1dfc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1dfd0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1dfe0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1dff0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1e000 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1e010 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
1e020 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
1e030 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1e040 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e050 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50  "Error. pulLastP
1e060 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
1e070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e080 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1e090 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1e0a0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1e0b0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1e0c0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1e0d0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1e0e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e0f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e100 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1e110 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e120 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1e130 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1e140 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1e150 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
1e160 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1e170 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1e180 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1e190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e1a0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
1e1b0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1e1c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1e1d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1e1e0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
1e1f0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1e200 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
1e210 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
1e220 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1e230 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1e240 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1e250 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e260 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
1e270 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1e280 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
1e290 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
1e2a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  IZED);..}...*pul
1e2b0 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b  LastPartLen = 0;
1e2c0 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 74  ...if (pLastPart
1e2d0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65   == NULL) {...te
1e2e0 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20  rminate_decrypt 
1e2f0 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  = 0;..}...if (te
1e300 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29  rminate_decrypt)
1e310 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
1e320 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
1e330 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20  ecrypt_active = 
1e340 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
1e350 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1e360 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1e370 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1e380 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1e390 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1e3a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e3b0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1e3c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1e3d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1e3e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1e3f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e400 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1e410 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1e420 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1e430 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1e440 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1e450 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28  , C_DigestInit)(
1e460 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1e470 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
1e480 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
1e490 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b  chanism) {..CACK
1e4a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e4b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1e4c0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1e4d0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1e4e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e4f0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1e500 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1e510 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1e520 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1e530 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1e540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1e550 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1e560 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1e570 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1e580 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e590 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1e5a0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1e5b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1e5c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1e5d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
1e5e0 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  est)(CK_SESSION_
1e5f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1e600 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
1e610 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
1e620 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
1e630 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
1e640 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
1e650 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
1e660 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e670 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1e680 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1e690 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1e6a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e6b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1e6c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1e6d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1e6e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1e6f0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1e700 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1e710 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1e720 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1e730 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1e740 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1e750 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1e760 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1e770 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1e780 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1e790 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
1e7a0 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
1e7b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1e7c0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1e7d0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
1e7e0 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09  G ulPartLen) {..
1e7f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e800 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1e810 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1e820 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1e830 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e840 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1e850 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1e860 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1e870 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1e880 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1e890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e8a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e8b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e8c0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1e8d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1e8e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1e8f0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1e900 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1e910 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1e920 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1e930 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53  _DigestKey)(CK_S
1e940 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1e950 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
1e960 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
1e970 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e980 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1e990 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1e9a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1e9b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e9c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1e9d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1e9e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e9f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1ea00 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1ea10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ea20 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1ea30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1ea40 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1ea50 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1ea60 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1ea70 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1ea80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1ea90 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1eaa0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1eab0 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28   C_DigestFinal)(
1eac0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1ead0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1eae0 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
1eaf0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1eb00 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
1eb10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eb20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1eb30 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1eb40 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1eb50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eb60 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1eb70 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1eb80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1eb90 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1eba0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1ebb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ebc0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1ebd0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1ebe0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1ebf0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1ec00 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1ec10 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1ec20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1ec30 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1ec40 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1ec50 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53  SignInit)(CK_SES
1ec60 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1ec70 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
1ec80 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
1ec90 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
1eca0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
1ecb0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
1ecc0 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
1ecd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ece0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1ecf0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1ed00 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1ed10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ed20 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1ed30 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1ed40 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1ed50 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1ed60 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
1ed70 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
1ed80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ed90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1eda0 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
1edb0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1edc0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1edd0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
1ede0 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
1edf0 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
1ee00 50 4b 43 53 20 26 26 20 70 4d 65 63 68 61 6e 69  PKCS && pMechani
1ee10 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
1ee20 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b   CKM_SHA1_RSA_PK
1ee30 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  CS) {...CACKEY_D
1ee40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ee50 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  or. pMechanism->
1ee60 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70  mechanism not sp
1ee70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52  ecified as CKM_R
1ee80 53 41 5f 50 4b 43 53 20 6f 72 20 43 4b 4d 5f 53  SA_PKCS or CKM_S
1ee90 48 41 31 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a  HA1_RSA_PKCS");.
1eea0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45  ...return(CKR_ME
1eeb0 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e  CHANISM_PARAM_IN
1eec0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1eed0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
1eee0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
1eef0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1ef00 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1ef10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ef20 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1ef30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ef40 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
1ef50 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
1ef60 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1ef70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1ef80 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1ef90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1efa0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1efb0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1efc0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1efd0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1efe0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1eff0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1f000 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1f010 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1f020 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1f030 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1f040 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1f050 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1f060 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1f070 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1f080 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f090 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1f0a0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1f0b0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1f0c0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1f0d0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1f0e0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1f0f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1f100 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
1f110 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1f120 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1f130 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1f140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f150 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72  Error.  Sign alr
1f160 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73  eady in progress
1f170 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1f180 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41  (CKR_OPERATION_A
1f190 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20  CTIVE);..}...if 
1f1a0 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f  (hKey >= cackey_
1f1b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f1c0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
1f1d0 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  unt) {...cackey_
1f1e0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1f1f0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1f200 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f210 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65  INTF("Error.  Ke
1f220 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  y handle out of 
1f230 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64  range (requested
1f240 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25   key %lu, only %
1f250 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76  lu identities av
1f260 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73  ailable).", (uns
1f270 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79  igned long) hKey
1f280 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1f290 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
1f2a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1f2b0 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
1f2c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59  ..return(CKR_KEY
1f2d0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1f2e0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
1f2f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f300 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31  .sign_active = 1
1f310 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
1f320 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1f330 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  gn_mechanism = p
1f340 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
1f350 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  nism;...cackey_s
1f360 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1f370 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20  ].sign_buflen = 
1f380 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  128;..cackey_ses
1f390 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1f3a0 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30  sign_bufused = 0
1f3b0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
1f3c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1f3d0 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73  n_buf = malloc(s
1f3e0 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65  izeof(*cackey_se
1f3f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f400 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63  .sign_buf) * cac
1f410 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1f420 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
1f430 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  en);...CACKEY_DE
1f440 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73  BUG_PRINTF("Sess
1f450 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65  ion %lu sign_ide
1f460 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64 65  ntity is %p (ide
1f470 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75  ntity #%lu)", (u
1f480 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53  nsigned long) hS
1f490 65 73 73 69 6f 6e 2c 20 26 63 61 63 6b 65 79 5f  ession, &cackey_
1f4a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f4b0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
1f4c0 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ey], (unsigned l
1f4d0 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61 63  ong) hKey);..cac
1f4e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1f4f0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
1f500 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73  tity = &cackey_s
1f510 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1f520 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65  ].identities[hKe
1f530 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y];...mutex_retv
1f540 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1f550 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1f560 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1f570 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1f580 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f590 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f5a0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1f5b0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1f5c0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1f5d0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1f5e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f5f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1f600 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1f610 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1f620 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1f630 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f640 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 49  C_Sign)(CK_SESSI
1f650 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1f660 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1f670 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
1f680 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
1f690 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
1f6a0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
1f6b0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
1f6c0 20 7b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72   {..CK_RV sign_r
1f6d0 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
1f6e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f6f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1f700 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1f710 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f720 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f730 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1f740 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f750 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1f760 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1f770 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43  }...sign_ret = C
1f780 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 73  _SignUpdate(hSes
1f790 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44  sion, pData, ulD
1f7a0 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ataLen);..if (si
1f7b0 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
1f7c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f7d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f7e0 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20  .  SignUpdate() 
1f7f0 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
1f800 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
1f810 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
1f820 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ign_ret);....ret
1f830 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09  urn(sign_ret);..
1f840 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43  }...sign_ret = C
1f850 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73  _SignFinal(hSess
1f860 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c  ion, pSignature,
1f870 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
1f880 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74  );..if (sign_ret
1f890 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
1f8a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f8b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
1f8c0 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65  nFinal() returne
1f8d0 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
1f8e0 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
1f8f0 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
1f900 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  );....return(sig
1f910 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43  n_ret);..}...CAC
1f920 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f930 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1f940 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1f950 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f960 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1f970 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1f980 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28  , C_SignUpdate)(
1f990 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1f9a0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1f9b0 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
1f9c0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
1f9d0 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
1f9e0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1f9f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1fa00 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1fa10 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1fa20 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1fa30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1fa40 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1fa50 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1fa60 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1fa70 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1fa80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1fa90 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1faa0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1fab0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1fac0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1fad0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1fae0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1faf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fb00 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1fb10 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1fb20 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1fb30 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1fb40 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61  D);..}...if (pPa
1fb50 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c  rt == NULL && ul
1fb60 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
1fb70 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
1fb80 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b  it if we are ask
1fb90 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69  ed to sign nothi
1fba0 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45  ng... */...CACKE
1fbb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fbc0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1fbd0 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
1fbe0 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
1fbf0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1fc00 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61  K);..}...if (pPa
1fc10 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
1fc20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fc30 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72  NTF("Error. pPar
1fc40 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75  t is NULL, but u
1fc50 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  lPartLen is not 
1fc60 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
1fc70 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1fc80 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50  D);..}...if (ulP
1fc90 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
1fca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fcb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50  INTF("Error. ulP
1fcc0 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74  artLen is 0, but
1fcd0 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55   pPart is not NU
1fce0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1fcf0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1fd00 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
1fd10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1fd20 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1fd30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1fd40 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1fd50 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1fd60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1fd70 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1fd80 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1fd90 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1fda0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1fdb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1fdc0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1fdd0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1fde0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1fdf0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1fe00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fe10 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1fe20 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1fe30 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1fe40 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1fe50 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1fe60 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1fe70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1fe80 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
1fe90 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1fea0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1feb0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1fec0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1fed0 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
1fee0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1fef0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
1ff00 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
1ff10 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  ED);..}...switch
1ff20 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
1ff30 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
1ff40 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
1ff50 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
1ff60 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c  S:..../* Accumul
1ff70 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ate directly */.
1ff80 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73  ...if ((cackey_s
1ff90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ffa0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
1ffb0 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61   ulPartLen) > ca
1ffc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1ffd0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
1ffe0 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  len) {.....cacke
1fff0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20000 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
20010 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b   *= 2;......cack
20020 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20030 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
20040 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f   realloc(cackey_
20050 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20060 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a  n].sign_buf, siz
20070 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
20080 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
20090 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
200a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
200b0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
200c0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
200d0 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
200e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
200f0 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73  n_buf + cackey_s
20100 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20110 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20  ].sign_bufused, 
20120 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e  pPart, ulPartLen
20130 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  );.....cackey_se
20140 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
20150 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d  .sign_bufused +=
20160 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09   ulPartLen;.....
20170 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b  break;...case CK
20180 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a  M_SHA1_RSA_PKCS:
20190 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74  ..../* Accumulat
201a0 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61  e into a SHA1 ha
201b0 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  sh */....cackey_
201c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
201d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
201e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
201f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20200 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
20210 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
20220 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
20230 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20240 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ....return(CKR_F
20250 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20260 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b  ORTED);....break
20270 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
20280 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
20290 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
202a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
202b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
202c0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
202d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
202e0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
202f0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
20300 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
20310 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
20320 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20330 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20340 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
20350 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
20360 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
20370 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20380 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b   C_SignFinal)(CK
20390 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
203a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
203b0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
203c0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
203d0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
203e0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54  {..static CK_BYT
203f0 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a  E sigbuf[1024];.
20400 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c  .ssize_t sigbufl
20410 65 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  en;..CK_RV retva
20420 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
20430 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d  ERROR;..int term
20440 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a  inate_sign = 1;.
20450 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
20460 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
20470 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
20480 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
20490 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
204a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
204b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
204c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
204d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
204e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
204f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
20500 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74  ...if (pulSignat
20510 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20  ureLen == NULL) 
20520 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20530 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20540 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
20550 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
20560 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
20570 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
20580 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
20590 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
205a0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
205b0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
205c0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
205d0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
205e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
205f0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
20600 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
20610 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
20620 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
20630 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
20640 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
20650 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
20660 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
20670 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
20680 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
20690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
206a0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
206b0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
206c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
206d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
206e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
206f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20700 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
20710 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20720 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20730 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20740 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20750 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
20760 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
20770 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
20780 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
20790 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
207a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
207b0 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
207c0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
207d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
207e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
207f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20800 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
20810 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
20820 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
20830 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
20840 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
20850 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
20860 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20870 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
20880 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
20890 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
208a0 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20  sk card to sign 
208b0 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  */....CACKEY_DEB
208c0 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e  UG_PRINTF("Askin
208d0 67 20 74 6f 20 64 65 63 72 79 70 74 20 66 72 6f  g to decrypt fro
208e0 6d 20 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e  m identity %p in
208f0 20 73 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 63   session %lu", c
20900 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20910 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
20920 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65  entity, (unsigne
20930 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e  d long) hSession
20940 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20  );....sigbuflen 
20950 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
20960 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
20970 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ts[cackey_sessio
20980 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
20990 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73  tID], cackey_ses
209a0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
209b0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63  sign_identity, c
209c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
209d0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
209e0 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f, cackey_sessio
209f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
20a00 6e 5f 62 75 66 6c 65 6e 2c 20 73 69 67 62 75 66  n_buflen, sigbuf
20a10 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29  , sizeof(sigbuf)
20a20 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75  );.....if (sigbu
20a30 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09  flen < 0) {.....
20a40 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65  /* Signing faile
20a50 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c  d. */.....retval
20a60 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
20a70 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65 20  RROR;....} else 
20a80 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
20a90 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20  ong) sigbuflen) 
20aa0 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  > *pulSignatureL
20ab0 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65  en && pSignature
20ac0 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65  ) {...../* Signe
20ad0 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65  d data too large
20ae0 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d   */.....retval =
20af0 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
20b00 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d  SMALL;......term
20b10 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a  inate_sign = 0;.
20b20 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
20b30 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
20b40 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69   0;......if (pSi
20b50 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09  gnature) {......
20b60 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72  memcpy(pSignatur
20b70 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62 75  e, sigbuf, sigbu
20b80 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72  flen);.......ter
20b90 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b  minate_sign = 1;
20ba0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c  .....}......*pul
20bb0 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73  SignatureLen = s
20bc0 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72  igbuflen;......r
20bd0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
20be0 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
20bf0 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f  ..case CKM_SHA1_
20c00 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
20c10 41 63 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f 20  Accumulate into 
20c20 61 20 53 48 41 31 20 68 61 73 68 20 2a 2f 0a 09  a SHA1 hash */..
20c30 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
20c40 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
20c50 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45  lock);.....CACKE
20c60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20c70 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
20c80 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20c90 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
20ca0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
20cb0 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72 65 74  PORTED);.....ret
20cc0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
20cd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
20ce0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
20cf0 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73 69  if (terminate_si
20d00 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  gn) {...if (cack
20d10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20d20 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20  sion].sign_buf) 
20d30 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
20d40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20d50 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09  on].sign_buf);..
20d60 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  .}....cackey_ses
20d70 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20d80 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b  sign_active = 0;
20d90 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
20da0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
20db0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20dc0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
20dd0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
20de0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20df0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20e00 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
20e10 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20e20 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
20e30 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
20e40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20e50 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
20e60 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
20e70 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
20e80 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20e90 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
20ea0 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29 28  ignRecoverInit)(
20eb0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
20ec0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
20ed0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
20ee0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
20ef0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
20f00 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
20f10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
20f20 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
20f30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
20f40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20f50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
20f60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
20f70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20f80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
20f90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
20fa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20fb0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20fc0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20fd0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
20fe0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
20ff0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
21000 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
21010 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21020 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
21030 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21040 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 29  , C_SignRecover)
21050 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
21060 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
21070 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
21080 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
21090 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
210a0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
210b0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
210c0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
210d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
210e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
210f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
21100 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
21110 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21120 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
21130 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
21140 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
21150 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
21160 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
21170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21180 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
21190 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
211a0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
211b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
211c0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
211d0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
211e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
211f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
21200 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
21210 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45 53  rifyInit)(CK_SES
21220 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
21230 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
21240 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
21250 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
21260 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
21270 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21280 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
21290 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
212a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
212b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
212c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
212d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
212e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
212f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
21300 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
21310 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21320 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
21330 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21340 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
21350 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21360 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
21370 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
21380 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
21390 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
213a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
213b0 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rify)(CK_SESSION
213c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
213d0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
213e0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
213f0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
21400 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
21410 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
21420 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
21430 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21440 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
21450 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
21460 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
21470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21480 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
21490 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
214a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
214b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
214c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
214d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
214e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
214f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21500 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
21510 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21520 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
21530 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
21540 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
21550 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
21560 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
21570 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53  rifyUpdate)(CK_S
21580 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
21590 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
215a0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
215b0 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b  ONG ulPartLen) {
215c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
215d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
215e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
215f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
21600 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21610 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
21620 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
21630 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21640 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
21650 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
21660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21670 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
21680 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21690 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
216a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
216b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
216c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
216d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
216e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
216f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
21700 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29 28   C_VerifyFinal)(
21710 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
21720 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
21730 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
21740 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
21750 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
21760 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21770 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21780 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21790 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
217a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
217b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
217c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
217d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
217e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
217f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
21800 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21810 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21820 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21830 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
21840 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21850 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
21860 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
21870 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21880 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
21890 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
218a0 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
218b0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
218c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
218d0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
218e0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
218f0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
21900 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
21910 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
21920 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
21930 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
21940 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21950 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21960 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
21970 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21980 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
21990 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
219a0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
219b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
219c0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
219d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
219e0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
219f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
21a00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
21a10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21a20 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
21a30 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
21a40 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65  K_RV, C_VerifyRe
21a50 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f  cover)(CK_SESSIO
21a60 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
21a70 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
21a80 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
21a90 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
21aa0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
21ab0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
21ac0 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
21ad0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
21ae0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21af0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
21b00 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
21b10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21b20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21b30 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21b40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21b50 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21b60 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21b70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21b80 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21b90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21ba0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
21bb0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
21bc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
21bd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
21be0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21bf0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
21c00 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21c10 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  , C_DigestEncryp
21c20 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
21c30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
21c40 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
21c50 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
21c60 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42   ulPartLen, CK_B
21c70 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
21c80 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
21c90 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
21ca0 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
21cb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21cc0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
21cd0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
21ce0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
21cf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21d00 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
21d10 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
21d20 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
21d30 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
21d40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
21d50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21d60 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
21d70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21d80 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
21d90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21da0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
21db0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
21dc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
21dd0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
21de0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
21df0 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
21e00 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
21e10 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
21e20 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
21e30 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
21e40 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
21e50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
21e60 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
21e70 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
21e80 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
21e90 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
21ea0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
21eb0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
21ec0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21ed0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21ee0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
21ef0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21f00 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
21f10 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
21f20 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
21f30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21f40 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
21f50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
21f60 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
21f70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
21f80 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
21f90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21fa0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
21fb0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
21fc0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72  K_RV, C_SignEncr
21fd0 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
21fe0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21ff0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
22000 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
22010 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
22020 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
22030 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
22040 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
22050 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
22060 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22070 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
22080 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
22090 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
220a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
220b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
220c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
220d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
220e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
220f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
22100 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22110 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22120 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22130 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
22140 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22150 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
22160 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
22170 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22180 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
22190 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
221a0 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
221b0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
221c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
221d0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
221e0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
221f0 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
22200 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
22210 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
22220 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
22230 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
22240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
22250 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
22260 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22270 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
22280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22290 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
222a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
222b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
222c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
222d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
222e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
222f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
22300 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22310 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
22320 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22330 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
22340 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22350 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
22360 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
22370 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
22380 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  teKey)(CK_SESSIO
22390 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
223a0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
223b0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
223c0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
223d0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
223e0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
223f0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
22400 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
22410 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22420 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
22430 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
22440 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
22450 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22460 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
22470 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
22480 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
22490 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
224a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
224b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
224c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
224d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
224e0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
224f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22500 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
22510 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
22520 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
22530 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
22540 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
22550 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29 28 43  nerateKeyPair)(C
22560 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22570 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
22580 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
22590 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
225a0 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69 63  BUTE_PTR pPublic
225b0 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  KeyTemplate, CK_
225c0 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65  ULONG ulPublicKe
225d0 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  yAttributeCount,
225e0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
225f0 52 20 70 50 72 69 76 61 74 65 4b 65 79 54 65 6d  R pPrivateKeyTem
22600 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
22610 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74 72  ulPrivateKeyAttr
22620 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f  ibuteCount, CK_O
22630 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
22640 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b   phPublicKey, CK
22650 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
22660 54 52 20 70 68 50 72 69 76 61 74 65 4b 65 79 29  TR phPrivateKey)
22670 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
22680 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22690 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
226a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
226b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
226c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
226d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
226e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
226f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22700 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22710 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22720 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
22730 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22740 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
22750 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
22760 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
22770 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
22780 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22790 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
227a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
227b0 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43 4b  V, C_WrapKey)(CK
227c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
227d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
227e0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
227f0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
22800 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69 6e  _HANDLE hWrappin
22810 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  gKey, CK_OBJECT_
22820 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f  HANDLE hKey, CK_
22830 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65  BYTE_PTR pWrappe
22840 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  dKey, CK_ULONG_P
22850 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65 79  TR pulWrappedKey
22860 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
22870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22880 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
22890 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
228a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
228b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
228c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
228d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
228e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
228f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
22900 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
22910 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22920 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
22930 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
22940 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
22950 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22960 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
22970 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22980 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
22990 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
229a0 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b  CK_RV, C_UnwrapK
229b0 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
229c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
229d0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
229e0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
229f0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 55  OBJECT_HANDLE hU
22a00 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  nwrappingKey, CK
22a10 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70  _BYTE_PTR pWrapp
22a20 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20  edKey, CK_ULONG 
22a30 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c  ulWrappedKeyLen,
22a40 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
22a50 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
22a60 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74  ULONG ulAttribut
22a70 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
22a80 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
22a90 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
22aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22ab0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
22ac0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
22ad0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22ae0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22af0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
22b00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22b10 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
22b20 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
22b30 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22b40 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22b50 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
22b60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
22b70 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
22b80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22b90 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
22ba0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22bb0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
22bc0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22bd0 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b 65  K_RV, C_DeriveKe
22be0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
22bf0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
22c00 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
22c10 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
22c20 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42 61  BJECT_HANDLE hBa
22c30 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49 42  seKey, CK_ATTRIB
22c40 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
22c50 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74  e, CK_ULONG ulAt
22c60 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
22c70 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
22c80 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
22c90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22ca0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
22cb0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
22cc0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
22cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22ce0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
22cf0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
22d00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
22d10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
22d20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
22d30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22d40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
22d50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22d60 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
22d70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22d80 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
22d90 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
22da0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
22db0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
22dc0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
22dd0 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53  edRandom)(CK_SES
22de0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
22df0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
22e00 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e  R pSeed, CK_ULON
22e10 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09  G ulSeedLen) {..
22e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22e30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22e40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22e50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22e60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22e70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22e80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22e90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22ea0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22eb0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
22ec0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22ed0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22ee0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22ef0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
22f00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22f10 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
22f20 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
22f30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22f40 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22f50 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22f60 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29  _GenerateRandom)
22f70 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
22f80 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
22f90 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d  BYTE_PTR pRandom
22fa0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
22fb0 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43  lRandomLen) {..C
22fc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22fd0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
22fe0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
22ff0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23010 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23020 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
23030 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
23040 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
23050 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
23060 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23070 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23080 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23090 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
230a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
230b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
230c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
230d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
230e0 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65  .}../* Deprecate
230f0 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b  d Function */.CK
23100 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
23110 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e  (CK_RV, C_GetFun
23120 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f  ctionStatus)(CK_
23130 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
23140 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
23150 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23160 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
23170 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23180 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
23190 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
231a0 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
231b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
231c0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
231d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
231e0 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
231f0 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
23200 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
23210 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
23220 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f   warning */.}../
23230 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e  * Deprecated Fun
23240 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49  ction */.CK_DEFI
23250 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
23260 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74  V, C_CancelFunct
23270 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion)(CK_SESSION_
23280 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
23290 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
232a0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
232b0 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
232c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
232d0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
232e0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
232f0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
23300 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
23310 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
23320 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
23330 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
23340 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
23350 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
23360 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
23370 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45   */.}..CK_DEFINE
23380 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23390 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69   C_GetFunctionLi
233a0 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f  st)(CK_FUNCTION_
233b0 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70 46  LIST_PTR_PTR ppF
233c0 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09  unctionList) {..
233d0 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54  CK_FUNCTION_LIST
233e0 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69  _PTR pFunctionLi
233f0 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  st;...CACKEY_DEB
23400 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
23410 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75  d.");...if (ppFu
23420 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55  nctionList == NU
23430 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
23440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23450 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69  or. ppFunctionLi
23460 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  st is NULL.");..
23470 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
23480 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
23490 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  ..pFunctionList 
234a0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
234b0 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29  *pFunctionList))
234c0 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ;...pFunctionLis
234d0 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  t->version.major
234e0 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50   = ((CACKEY_CRYP
234f0 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
23500 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  E) >> 16) & 0xff
23510 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
23520 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  ->version.minor 
23530 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54  = ((CACKEY_CRYPT
23540 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
23550 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
23560 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
23570 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20  >C_Initialize = 
23580 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70  C_Initialize;..p
23590 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
235a0 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e  Finalize = C_Fin
235b0 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  alize;..pFunctio
235c0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f  nList->C_GetInfo
235d0 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70   = C_GetInfo;..p
235e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
235f0 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f  GetSlotList = C_
23600 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46  GetSlotList;..pF
23610 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
23620 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47  etSlotInfo = C_G
23630 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75  etSlotInfo;..pFu
23640 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
23650 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47  tTokenInfo = C_G
23660 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46  etTokenInfo;..pF
23670 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57  unctionList->C_W
23680 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20  aitForSlotEvent 
23690 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45  = C_WaitForSlotE
236a0 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  vent;..pFunction
236b0 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61  List->C_GetMecha
236c0 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74  nismList = C_Get
236d0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09  MechanismList;..
236e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
236f0 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66  _GetMechanismInf
23700 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  o = C_GetMechani
23710 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  smInfo;..pFuncti
23720 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f  onList->C_InitTo
23730 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65  ken = C_InitToke
23740 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
23750 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43  t->C_InitPIN = C
23760 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63  _InitPIN;..pFunc
23770 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50  tionList->C_SetP
23780 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09  IN = C_SetPIN;..
23790 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
237a0 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43  _OpenSession = C
237b0 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70  _OpenSession;..p
237c0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
237d0 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 43  CloseSession = C
237e0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09  _CloseSession;..
237f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23800 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
23810 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  s = C_CloseAllSe
23820 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69  ssions;..pFuncti
23830 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 73  onList->C_GetSes
23840 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74  sionInfo = C_Get
23850 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46  SessionInfo;..pF
23860 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
23870 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
23880 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f   = C_GetOperatio
23890 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  nState;..pFuncti
238a0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65  onList->C_SetOpe
238b0 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f  rationState = C_
238c0 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
238d0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
238e0 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c  t->C_Login = C_L
238f0 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ogin;..pFunction
23900 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d  List->C_Logout =
23910 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e   C_Logout;..pFun
23920 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65  ctionList->C_Cre
23930 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72  ateObject = C_Cr
23940 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75  eateObject;..pFu
23950 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f  nctionList->C_Co
23960 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70  pyObject = C_Cop
23970 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  yObject;..pFunct
23980 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72  ionList->C_Destr
23990 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 73  oyObject = C_Des
239a0 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75  troyObject;..pFu
239b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
239c0 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f  tObjectSize = C_
239d0 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09  GetObjectSize;..
239e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
239f0 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
23a00 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62  ue = C_GetAttrib
23a10 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63  uteValue;..pFunc
23a20 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41  tionList->C_SetA
23a30 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20  ttributeValue = 
23a40 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
23a50 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  lue;..pFunctionL
23a60 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
23a70 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f  tsInit = C_FindO
23a80 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 75  bjectsInit;..pFu
23a90 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
23aa0 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 69  ndObjects = C_Fi
23ab0 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e  ndObjects;..pFun
23ac0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
23ad0 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20  dObjectsFinal = 
23ae0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
23af0 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
23b00 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69  st->C_EncryptIni
23b10 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e 69  t = C_EncryptIni
23b20 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
23b30 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 43  t->C_Encrypt = C
23b40 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e 63  _Encrypt;..pFunc
23b50 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
23b60 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45 6e  yptUpdate = C_En
23b70 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46  cryptUpdate;..pF
23b80 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
23b90 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f  ncryptFinal = C_
23ba0 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70  EncryptFinal;..p
23bb0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23bc0 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  DecryptInit = C_
23bd0 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  DecryptInit;..pF
23be0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
23bf0 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72 79  ecrypt = C_Decry
23c00 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
23c10 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 64  st->C_DecryptUpd
23c20 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 55  ate = C_DecryptU
23c30 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
23c40 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
23c50 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 70  Final = C_Decryp
23c60 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
23c70 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
23c80 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74 49  Init = C_DigestI
23c90 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
23ca0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20  ist->C_Digest = 
23cb0 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e 63  C_Digest;..pFunc
23cc0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
23cd0 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67  stUpdate = C_Dig
23ce0 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  estUpdate;..pFun
23cf0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
23d00 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 73  estKey = C_Diges
23d10 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tKey;..pFunction
23d20 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 69  List->C_DigestFi
23d30 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 69  nal = C_DigestFi
23d40 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
23d50 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20  ist->C_SignInit 
23d60 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70  = C_SignInit;..p
23d70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23d80 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09  Sign = C_Sign;..
23d90 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23da0 5f 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43 5f  _SignUpdate = C_
23db0 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 75  SignUpdate;..pFu
23dc0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
23dd0 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e  gnFinal = C_Sign
23de0 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
23df0 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63  nList->C_SignRec
23e00 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 67  overInit = C_Sig
23e10 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70  nRecoverInit;..p
23e20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23e30 53 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f  SignRecover = C_
23e40 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46  SignRecover;..pF
23e50 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
23e60 65 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 65  erifyInit = C_Ve
23e70 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63  rifyInit;..pFunc
23e80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
23e90 66 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09  fy = C_Verify;..
23ea0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23eb0 5f 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20  _VerifyUpdate = 
23ec0 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a  C_VerifyUpdate;.
23ed0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
23ee0 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d 20  C_VerifyFinal = 
23ef0 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09  C_VerifyFinal;..
23f00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
23f10 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
23f20 69 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63  it = C_VerifyRec
23f30 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63  overInit;..pFunc
23f40 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
23f50 66 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 65  fyRecover = C_Ve
23f60 72 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 46  rifyRecover;..pF
23f70 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
23f80 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
23f90 74 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e 63  te = C_DigestEnc
23fa0 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
23fb0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
23fc0 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
23fd0 65 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69 67  e = C_DecryptDig
23fe0 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  estUpdate;..pFun
23ff0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
24000 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  nEncryptUpdate =
24010 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70   C_SignEncryptUp
24020 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
24030 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 56  List->C_DecryptV
24040 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f  erifyUpdate = C_
24050 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
24060 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
24070 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b  ist->C_GenerateK
24080 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b  ey = C_GenerateK
24090 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
240a0 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65  st->C_GenerateKe
240b0 79 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 61  yPair = C_Genera
240c0 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 6e  teKeyPair;..pFun
240d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61  ctionList->C_Wra
240e0 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 79  pKey = C_WrapKey
240f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24100 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20  ->C_UnwrapKey = 
24110 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46  C_UnwrapKey;..pF
24120 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
24130 65 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 72  eriveKey = C_Der
24140 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  iveKey;..pFuncti
24150 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 61  onList->C_SeedRa
24160 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e  ndom = C_SeedRan
24170 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  dom;..pFunctionL
24180 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52  ist->C_GenerateR
24190 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61  andom = C_Genera
241a0 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63  teRandom;..pFunc
241b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46  tionList->C_GetF
241c0 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d 20  unctionStatus = 
241d0 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
241e0 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  tus;..pFunctionL
241f0 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e  ist->C_CancelFun
24200 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c  ction = C_Cancel
24210 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63  Function;..pFunc
24220 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46  tionList->C_GetF
24230 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f  unctionList = C_
24240 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b  GetFunctionList;
24250 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69  ...*ppFunctionLi
24260 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69  st = pFunctionLi
24270 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  st;...CACKEY_DEB
24280 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24290 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
242a0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
242b0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
242c0 0a                                               .