Hex Artifact Content

Artifact a15198f18c291ac6203551e43dc0ae71fe3f3194:


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 66 66 6c 75 73 68 28 73 74 64 65 72 72  ); fflush(stderr
1330: 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43  ); }.#  define C
1340: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1350: 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 7b 20  TBUF(f, x, y) { 
1360: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1370: 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65 64 20  MPBUF; unsigned 
1380: 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42 55 46  long idx; TMPBUF
1390: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
13a0: 72 20 2a 29 20 28 78 29 3b 20 66 70 72 69 6e 74  r *) (x); fprint
13b0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a  f(stderr, "%s():
13c0: 25 69 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20  %i: %s  (%s/%lu 
13d0: 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63  = {%02x", __func
13e0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c  __, __LINE__, f,
13f0: 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c   #x, (unsigned l
1400: 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46  ong) (y), TMPBUF
1410: 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d  [0]); for (idx =
1420: 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69   1; idx < (y); i
1430: 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28  dx++) { fprintf(
1440: 73 74 64 65 72 72 2c 20 22 2c 20 25 30 32 78 22  stderr, ", %02x"
1450: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20  , TMPBUF[idx]); 
1460: 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  }; fprintf(stder
1470: 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 66 66 6c 75  r, "})\n"); fflu
1480: 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23 20  sh(stderr); }.# 
1490: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
14a0: 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b  EBUG_PERROR(x) {
14b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14c0: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f   "%s():%i: ", __
14d0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
14e0: 29 3b 20 70 65 72 72 6f 72 28 78 29 3b 20 66 66  ); perror(x); ff
14f0: 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a  lush(stderr); }.
1500: 23 20 20 64 65 66 69 6e 65 20 66 72 65 65 28 78  #  define free(x
1510: 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ) { CACKEY_DEBUG
1520: 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28 25 70  _PRINTF("FREE(%p
1530: 29 20 28 25 73 29 22 2c 20 78 2c 20 23 78 29 3b  ) (%s)", x, #x);
1540: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1550: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59  tic void *CACKEY
1560: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
1570: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  OC(size_t size, 
1580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
1590: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
15a0: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
15b0: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  etval = malloc(s
15c0: 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ize);...fprintf(
15d0: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69  stderr, "%s():%i
15e0: 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29  : ", func, line)
15f0: 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
1600: 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  r, "MALLOC() = %
1610: 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70  p", retval);..fp
1620: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1630: 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 73 74 64  n");..fflush(std
1640: 65 72 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  err);...return(r
1650: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
1660: 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44  c void *CACKEY_D
1670: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f  EBUG_FUNC_REALLO
1680: 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a  C(void *ptr, siz
1690: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
16a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
16b0: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72  line) {..void *r
16c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
16d0: 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73  = realloc(ptr, s
16e0: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76  ize);...if (retv
16f0: 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66  al != ptr) {...f
1700: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1710: 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63  %s():%i: ", func
1720: 2c 20 6c 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e  , line);...fprin
1730: 74 66 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c  tf(stderr, "REAL
1740: 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70  LOC(%p) = %p", p
1750: 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66  tr, retval);...f
1760: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1770: 5c 6e 22 29 3b 0a 09 09 66 66 6c 75 73 68 28 73  \n");...fflush(s
1780: 74 64 65 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74  tderr);..}...ret
1790: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
17a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41 43  static char *CAC
17b0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
17c0: 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61 72  TRDUP(const char
17d0: 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68 61   *ptr, const cha
17e0: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e  r *func, int lin
17f0: 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 76  e) {..char *retv
1800: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73  al;...retval = s
1810: 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66 70  trdup(ptr);...fp
1820: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
1830: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c  s():%i: ", func,
1840: 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66   line);..fprintf
1850: 28 73 74 64 65 72 72 2c 20 22 53 54 52 44 55 50  (stderr, "STRDUP
1860: 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c  _MALLOC() = %p",
1870: 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e   retval);..fprin
1880: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29  tf(stderr, "\n")
1890: 3b 0a 09 66 66 6c 75 73 68 28 73 74 64 65 72 72  ;..fflush(stderr
18a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
18b0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  al);.}..static c
18c0: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
18d0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
18e0: 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67 6e 65 64  _TO_STR(unsigned
18f0: 20 63 68 61 72 20 74 61 67 29 20 7b 0a 09 73 77   char tag) {..sw
1900: 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 63  itch (tag) {...c
1910: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
1920: 52 44 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  RDID:....return(
1930: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49  "GSCIS_TAG_CARDI
1940: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
1950: 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 3a 0a 09  S_TAG_CCC_VER:..
1960: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1970: 54 41 47 5f 43 43 43 5f 56 45 52 22 29 3b 0a 09  TAG_CCC_VER");..
1980: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1990: 43 43 47 5f 56 45 52 3a 0a 09 09 09 72 65 74 75  CCG_VER:....retu
19a0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43  rn("GSCIS_TAG_CC
19b0: 47 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  G_VER");...case 
19c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
19d0: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  L:....return("GS
19e0: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 22  CIS_TAG_CARDURL"
19f0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1a00: 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 72  TAG_PKCS15:....r
1a10: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1a20: 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09 63 61 73  _PKCS15");...cas
1a30: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
1a40: 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72  DATA_MODEL:....r
1a50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1a60: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 22  _REG_DATA_MODEL"
1a70: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1a80: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
1a90: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1aa0: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 22 29 3b  TAG_ACR_TABLE");
1ab0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1ac0: 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a 09 09 09  G_CARD_APDU:....
1ad0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1ae0: 47 5f 43 41 52 44 5f 41 50 44 55 22 29 3b 0a 09  G_CARD_APDU");..
1af0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1b00: 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a 09 09 09  REDIRECTION:....
1b10: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1b20: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 22 29 3b  G_REDIRECTION");
1b30: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1b40: 47 5f 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  G_CT:....return(
1b50: 22 47 53 43 49 53 5f 54 41 47 5f 43 54 22 29 3b  "GSCIS_TAG_CT");
1b60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1b70: 47 5f 53 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  G_ST:....return(
1b80: 22 47 53 43 49 53 5f 54 41 47 5f 53 54 22 29 3b  "GSCIS_TAG_ST");
1b90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1ba0: 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09 09 72 65  G_NEXTCCC:....re
1bb0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1bc0: 4e 45 58 54 43 43 43 22 29 3b 0a 09 09 63 61 73  NEXTCCC");...cas
1bd0: 65 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d  e GSCIS_TAG_FNAM
1be0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1bf0: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 22 29 3b  CIS_TAG_FNAME");
1c00: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c10: 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_MNAME:....retu
1c20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4d 4e  rn("GSCIS_TAG_MN
1c30: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
1c40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09  CIS_TAG_LNAME:..
1c50: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1c60: 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_LNAME");...c
1c70: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55  ase GSCIS_TAG_SU
1c80: 46 46 49 58 3a 0a 09 09 09 72 65 74 75 72 6e 28  FFIX:....return(
1c90: 22 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49  "GSCIS_TAG_SUFFI
1ca0: 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  X");...case GSCI
1cb0: 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43  S_TAG_GOVT_AGENC
1cc0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
1cd0: 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45  CIS_TAG_GOVT_AGE
1ce0: 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  NCY");...case GS
1cf0: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 3a 0a  CIS_TAG_BUREAU:.
1d00: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1d10: 5f 54 41 47 5f 42 55 52 45 41 55 22 29 3b 0a 09  _TAG_BUREAU");..
1d20: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1d30: 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a 09 09 09  BUREAU_CODE:....
1d40: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1d50: 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 22 29 3b  G_BUREAU_CODE");
1d60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d70: 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a 09 09 09  G_DEPT_CODE:....
1d80: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1d90: 47 5f 44 45 50 54 5f 43 4f 44 45 22 29 3b 0a 09  G_DEPT_CODE");..
1da0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1db0: 54 49 54 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TITLE:....return
1dc0: 28 22 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  ("GSCIS_TAG_TITL
1dd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1de0: 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 3a 0a  S_TAG_BUILDING:.
1df0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e00: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 22 29 3b  _TAG_BUILDING");
1e10: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1e20: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 3a 0a  G_OFFICE_ADDR1:.
1e30: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
1e50: 31 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  1");...case GSCI
1e60: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44  S_TAG_OFFICE_ADD
1e70: 52 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  R2:....return("G
1e80: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
1e90: 41 44 44 52 32 22 29 3b 0a 09 09 63 61 73 65 20  ADDR2");...case 
1ea0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
1eb0: 5f 43 49 54 59 3a 0a 09 09 09 72 65 74 75 72 6e  _CITY:....return
1ec0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
1ed0: 43 45 5f 43 49 54 59 22 29 3b 0a 09 09 63 61 73  CE_CITY");...cas
1ee0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1ef0: 43 45 5f 53 54 41 54 45 3a 0a 09 09 09 72 65 74  CE_STATE:....ret
1f00: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1f10: 46 46 49 43 45 5f 53 54 41 54 45 22 29 3b 0a 09  FFICE_STATE");..
1f20: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1f30: 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09 09 09 72  OFFICE_ZIP:....r
1f40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1f50: 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29 3b 0a 09  _OFFICE_ZIP");..
1f60: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1f70: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 3a 0a  OFFICE_COUNTRY:.
1f80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1f90: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e  _TAG_OFFICE_COUN
1fa0: 54 52 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TRY");...case GS
1fb0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
1fc0: 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  HONE:....return(
1fd0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1fe0: 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 63 61 73  E_PHONE");...cas
1ff0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2000: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a 0a 09 09  CE_PHONE_EXT:...
2010: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2020: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f  AG_OFFICE_PHONE_
2030: 45 58 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  EXT");...case GS
2040: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
2050: 41 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  AX:....return("G
2060: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2070: 46 41 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53  FAX");...case GS
2080: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45  CIS_TAG_OFFICE_E
2090: 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  MAIL:....return(
20a0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
20b0: 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 63 61 73  E_EMAIL");...cas
20c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
20d0: 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 65 74 75  CE_ROOM:....retu
20e0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
20f0: 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63  FICE_ROOM");...c
2100: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f  ase GSCIS_TAG_NO
2110: 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a 09 09 09  NGOV_AGENCY:....
2120: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2130: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 22  G_NONGOV_AGENCY"
2140: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2150: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
2160: 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  OR:....return("G
2170: 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53  SCIS_TAG_SSN_DES
2180: 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09 63 61 73  IGNATOR");...cas
2190: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 3a  e GSCIS_TAG_SSN:
21a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
21b0: 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a 09 09 63  S_TAG_SSN");...c
21c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f  ase GSCIS_TAG_DO
21d0: 42 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  B:....return("GS
21e0: 43 49 53 5f 54 41 47 5f 44 4f 42 22 29 3b 0a 09  CIS_TAG_DOB");..
21f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2200: 47 45 4e 44 45 52 3a 0a 09 09 09 72 65 74 75 72  GENDER:....retur
2210: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 45 4e  n("GSCIS_TAG_GEN
2220: 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  DER");...case GS
2230: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 3a 0a  CIS_TAG_USERID:.
2240: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2250: 5f 54 41 47 5f 55 53 45 52 49 44 22 29 3b 0a 09  _TAG_USERID");..
2260: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2270: 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 74 75 72  DOMAIN:....retur
2280: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d  n("GSCIS_TAG_DOM
2290: 41 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIN");...case GS
22a0: 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44  CIS_TAG_PASSWORD
22b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
22c0: 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 22  IS_TAG_PASSWORD"
22d0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
22e0: 54 41 47 5f 49 53 53 55 45 52 49 44 3a 0a 09 09  TAG_ISSUERID:...
22f0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2300: 41 47 5f 49 53 53 55 45 52 49 44 22 29 3b 0a 09  AG_ISSUERID");..
2310: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2320: 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74 75 72 6e  SERNO:....return
2330: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  ("GSCIS_TAG_SERN
2340: 4f 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  O");...case GSCI
2350: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
2360: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2370: 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54  IS_TAG_ISSUE_DAT
2380: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2390: 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54  S_TAG_EXPIRE_DAT
23a0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
23b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
23c0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
23d0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50  CIS_TAG_CARD_TYP
23e0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
23f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50  CIS_TAG_CARD_TYP
2400: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2410: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
2420: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2430: 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49  GSCIS_TAG_SECURI
2440: 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  TY_CODE");...cas
2450: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
2460: 49 44 5f 41 49 44 3a 0a 09 09 09 72 65 74 75 72  ID_AID:....retur
2470: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52  n("GSCIS_TAG_CAR
2480: 44 49 44 5f 41 49 44 22 29 3b 0a 09 09 63 61 73  DID_AID");...cas
2490: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
24a0: 49 46 49 43 41 54 45 3a 0a 09 09 09 72 65 74 75  IFICATE:....retu
24b0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
24c0: 52 54 49 46 49 43 41 54 45 22 29 3b 0a 09 09 63  RTIFICATE");...c
24d0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
24e0: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09  RT_ISSUE_DATE:..
24f0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2500: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
2510: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
2520: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
2530: 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  IRE_DATE:....ret
2540: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
2550: 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 22  ERT_EXPIRE_DATE"
2560: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22  );..}...return("
2570: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
2580: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2590: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
25a0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
25b0: 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f 64 65 29  TR(LONG retcode)
25c0: 20 7b 0a 09 73 77 69 74 63 68 20 28 72 65 74 63   {..switch (retc
25d0: 6f 64 65 29 20 7b 0a 09 09 63 61 73 65 20 53 43  ode) {...case SC
25e0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 3a 0a 09  ARD_S_SUCCESS:..
25f0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2600: 53 5f 53 55 43 43 45 53 53 22 29 3b 0a 09 09 63  S_SUCCESS");...c
2610: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 43  ase SCARD_E_CANC
2620: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ELLED:....return
2630: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c  ("SCARD_E_CANCEL
2640: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
2650: 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f  ARD_E_CANT_DISPO
2660: 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  SE:....return("S
2670: 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50  CARD_E_CANT_DISP
2680: 4f 53 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OSE");...case SC
2690: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45  ARD_E_INSUFFICIE
26a0: 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09 09 72 65  NT_BUFFER:....re
26b0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
26c0: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
26d0: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  R");...case SCAR
26e0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 3a  D_E_INVALID_ATR:
26f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2700: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 22  D_E_INVALID_ATR"
2710: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2720: 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  E_INVALID_HANDLE
2730: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2740: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
2750: 44 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  DLE");...case SC
2760: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41  ARD_E_INVALID_PA
2770: 52 41 4d 45 54 45 52 3a 0a 09 09 09 72 65 74 75  RAMETER:....retu
2780: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
2790: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 22 29 3b  LID_PARAMETER");
27a0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
27b0: 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 3a 0a  INVALID_TARGET:.
27c0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
27d0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45  _E_INVALID_TARGE
27e0: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  T");...case SCAR
27f0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55  D_E_INVALID_VALU
2800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
2810: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41  ARD_E_INVALID_VA
2820: 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LUE");...case SC
2830: 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a  ARD_E_NO_MEMORY:
2840: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2850: 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b  D_E_NO_MEMORY");
2860: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2870: 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 3a 0a  UNKNOWN_READER:.
2880: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2890: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45  _E_UNKNOWN_READE
28a0: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  R");...case SCAR
28b0: 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a 09 09 09  D_E_TIMEOUT:....
28c0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
28d0: 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09 63 61 73  TIMEOUT");...cas
28e0: 65 20 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e  e SCARD_E_SHARIN
28f0: 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09  G_VIOLATION:....
2900: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2910: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
2920: 4e 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  N");...case SCAR
2930: 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44  D_E_NO_SMARTCARD
2940: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2950: 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52  RD_E_NO_SMARTCAR
2960: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2970: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44  D_E_UNKNOWN_CARD
2980: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2990: 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52  RD_E_UNKNOWN_CAR
29a0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
29b0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
29c0: 43 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  CH:....return("S
29d0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
29e0: 4d 41 54 43 48 22 29 3b 0a 09 09 63 61 73 65 20  MATCH");...case 
29f0: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44  SCARD_E_NOT_READ
2a00: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  Y:....return("SC
2a10: 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 22  ARD_E_NOT_READY"
2a20: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2a30: 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c  E_SYSTEM_CANCELL
2a40: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
2a50: 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41  CARD_E_SYSTEM_CA
2a60: 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73  NCELLED");...cas
2a70: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52  e SCARD_E_NOT_TR
2a80: 41 4e 53 41 43 54 45 44 3a 0a 09 09 09 72 65 74  ANSACTED:....ret
2a90: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54  urn("SCARD_E_NOT
2aa0: 5f 54 52 41 4e 53 41 43 54 45 44 22 29 3b 0a 09  _TRANSACTED");..
2ab0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45  .case SCARD_E_RE
2ac0: 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45  ADER_UNAVAILABLE
2ad0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2ae0: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56  RD_E_READER_UNAV
2af0: 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  AILABLE");...cas
2b00: 65 20 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50  e SCARD_W_UNSUPP
2b10: 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  ORTED_CARD:....r
2b20: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55  eturn("SCARD_W_U
2b30: 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 22  NSUPPORTED_CARD"
2b40: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2b50: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43  W_UNRESPONSIVE_C
2b60: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
2b70: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
2b80: 53 49 56 45 5f 43 41 52 44 22 29 3b 0a 09 09 63  SIVE_CARD");...c
2b90: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f  ase SCARD_W_UNPO
2ba0: 57 45 52 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  WERED_CARD:....r
2bb0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55  eturn("SCARD_W_U
2bc0: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 22 29 3b  NPOWERED_CARD");
2bd0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
2be0: 52 45 53 45 54 5f 43 41 52 44 3a 0a 09 09 09 72  RESET_CARD:....r
2bf0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52  eturn("SCARD_W_R
2c00: 45 53 45 54 5f 43 41 52 44 22 29 3b 0a 09 09 63  ESET_CARD");...c
2c10: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 4d 4f  ase SCARD_W_REMO
2c20: 56 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  VED_CARD:....ret
2c30: 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 4d  urn("SCARD_W_REM
2c40: 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  OVED_CARD");...c
2c50: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 43 49 5f  ase SCARD_E_PCI_
2c60: 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72 65  TOO_SMALL:....re
2c70: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 43  turn("SCARD_E_PC
2c80: 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09  I_TOO_SMALL");..
2c90: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45  .case SCARD_E_RE
2ca0: 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44  ADER_UNSUPPORTED
2cb0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2cc0: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55  RD_E_READER_UNSU
2cd0: 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73  PPORTED");...cas
2ce0: 65 20 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43  e SCARD_E_DUPLIC
2cf0: 41 54 45 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  ATE_READER:....r
2d00: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 44  eturn("SCARD_E_D
2d10: 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 22  UPLICATE_READER"
2d20: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2d30: 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54  E_CARD_UNSUPPORT
2d40: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
2d50: 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55  CARD_E_CARD_UNSU
2d60: 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73  PPORTED");...cas
2d70: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52  e SCARD_E_NO_SER
2d80: 56 49 43 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  VICE:....return(
2d90: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56  "SCARD_E_NO_SERV
2da0: 49 43 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ICE");...case SC
2db0: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
2dc0: 4f 50 50 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  OPPED:....return
2dd0: 28 22 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43  ("SCARD_E_SERVIC
2de0: 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a 09 09 63  E_STOPPED");...c
2df0: 61 73 65 20 53 43 41 52 44 5f 57 5f 49 4e 53 45  ase SCARD_W_INSE
2e00: 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65  RTED_CARD:....re
2e10: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 49 4e  turn("SCARD_W_IN
2e20: 53 45 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  SERTED_CARD");..
2e30: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e  .case SCARD_E_UN
2e40: 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52  SUPPORTED_FEATUR
2e50: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
2e60: 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_E_UNSUPPORTE
2e70: 44 5f 46 45 41 54 55 52 45 22 29 3b 0a 09 7d 0a  D_FEATURE");..}.
2e80: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
2e90: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
2ea0: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
2eb0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
2ec0: 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36  ID_TO_STR(uint16
2ed0: 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69  _t objid) {..swi
2ee0: 74 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09  tch (objid) {...
2ef0: 63 61 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09  case 0x2000:....
2f00: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
2f10: 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c  LV_OBJID_GENERAL
2f20: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
2f30: 78 32 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x2100:....return
2f40: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
2f50: 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e  ID_PROPERSONALIN
2f60: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33  FO");...case 0x3
2f70: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
2f80: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
2f90: 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29  _ACCESSCONTROL")
2fa0: 3b 0a 09 09 63 61 73 65 20 30 78 34 30 30 30 3a  ;...case 0x4000:
2fb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2fc0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47  EY_TLV_OBJID_LOG
2fd0: 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35  IN");...case 0x5
2fe0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
2ff0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3000: 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63  _CARDINFO");...c
3010: 61 73 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72  ase 0x6000:....r
3020: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3030: 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49  V_OBJID_BIOMETRI
3040: 43 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37  CS");...case 0x7
3050: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3060: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3070: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 22  _DIGITALSIGCERT"
3080: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 30  );...case 0x0200
3090: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30a0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
30b0: 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61  C_PERSON");...ca
30c0: 73 65 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65  se 0x0202:....re
30d0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
30e0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46  _OBJID_CAC_BENEF
30f0: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ITS");...case 0x
3100: 30 32 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28  0203:....return(
3110: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3120: 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46  D_CAC_OTHERBENEF
3130: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ITS");...case 0x
3140: 30 32 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  0201:....return(
3150: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3160: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22  D_CAC_PERSONNEL"
3170: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 46 45  );...case 0x02FE
3180: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3190: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
31a0: 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a  C_PKICERT");..}.
31b0: 09 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f  ...return("UNKNO
31c0: 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  WN");.}..static 
31d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b  const char *CACK
31e0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
31f0: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e  PTYPE_TO_STR(uin
3200: 74 38 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a  t8_t apptype) {.
3210: 09 73 77 69 74 63 68 20 28 61 70 70 74 79 70 65  .switch (apptype
3220: 29 20 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a  ) {...case 0x00:
3230: 0a 09 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45  ....return("NONE
3240: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a  ");...case 0x01:
3250: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3260: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3270: 49 43 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  IC");...case 0x0
3280: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  2:....return("CA
3290: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
32a0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a  ");...case 0x03:
32b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
32c0: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
32d0: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  IC | CACKEY_TLV_
32e0: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73  APP_SKI");...cas
32f0: 65 20 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72  e 0x04:....retur
3300: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3310: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_PKI");...case 
3320: 30 78 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x05:....return(
3330: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3340: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
3350: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a  _TLV_APP_PKI");.
3360: 09 09 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09  ..case 0x06:....
3370: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3380: 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43  LV_APP_SKI | CAC
3390: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22  KEY_TLV_APP_PKI"
33a0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a  );...case 0x07:.
33b0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
33c0: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
33d0: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  C | CACKEY_TLV_A
33e0: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f  PP_SKI | CACKEY_
33f0: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
3400: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41  }...return("INVA
3410: 4c 49 44 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66  LID");.}..#  def
3420: 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41  ine malloc(x) CA
3430: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3440: 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63  MALLOC(x, __func
3450: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20  __, __LINE__).# 
3460: 20 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28   define realloc(
3470: 78 2c 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42  x, y) CACKEY_DEB
3480: 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28  UG_FUNC_REALLOC(
3490: 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  x, y, __func__, 
34a0: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64  __LINE__).#  ifd
34b0: 65 66 20 73 74 72 64 75 70 0a 23 20 20 20 20 75  ef strdup.#    u
34c0: 6e 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 65  ndef strdup.#  e
34d0: 6e 64 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73  ndif.#  define s
34e0: 74 72 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f  trdup(x) CACKEY_
34f0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55  DEBUG_FUNC_STRDU
3500: 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f  P(x, __func__, _
3510: 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23  _LINE__).#else.#
3520: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
3530: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e  DEBUG_PRINTF(x..
3540: 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  .) /**/.#  defin
3550: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
3560: 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29  RINTBUF(f, x, y)
3570: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
3580: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 45 52  CACKEY_DEBUG_PER
3590: 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64  ROR(x) /**/.#  d
35a0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
35b0: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
35c0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
35d0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
35e0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
35f0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
3600: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
3610: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
3620: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
3630: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
3640: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
3650: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
3660: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3670: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 78  APPTYPE_TO_STR(x
3680: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
3690: 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63  D".#endif..struc
36a0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
36b0: 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73 69 67 6e  entity {..unsign
36c0: 65 64 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37  ed char applet[7
36d0: 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 66 69 6c  ];..uint16_t fil
36e0: 65 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  e;...unsigned ch
36f0: 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 73 69 7a  ar *label;...siz
3700: 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f  e_t certificate_
3710: 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  len;..unsigned c
3720: 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65  har *certificate
3730: 3b 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73  ;...ssize_t keys
3740: 69 7a 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ize;.};..struct 
3750: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
3760: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
3770: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
3780: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a  pcsc_identity;..
3790: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61  .CK_ATTRIBUTE *a
37a0: 74 74 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55  ttributes;..CK_U
37b0: 4c 4f 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f  LONG attributes_
37c0: 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63  count;.};..struc
37d0: 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  t cackey_session
37e0: 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a   {..int active;.
37f0: 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
3800: 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20  tID;...CK_STATE 
3810: 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53  state;..CK_FLAGS
3820: 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e   flags;..CK_ULON
3830: 47 20 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b  G ulDeviceError;
3840: 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  ..CK_VOID_PTR pA
3850: 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f  pplication;..CK_
3860: 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a  NOTIFY Notify;..
3870: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
3880: 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
3890: 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
38a0: 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63  ong identities_c
38b0: 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72  ount;...int sear
38c0: 63 68 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41  ch_active;..CK_A
38d0: 54 54 52 49 42 55 54 45 5f 50 54 52 20 73 65 61  TTRIBUTE_PTR sea
38e0: 72 63 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55  rch_query;..CK_U
38f0: 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72  LONG search_quer
3900: 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e  y_count;..unsign
3910: 65 64 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63  ed long search_c
3920: 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69  urr_id;...int si
3930: 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d  gn_active;..CK_M
3940: 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69  ECHANISM_TYPE si
3950: 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43  gn_mechanism;..C
3960: 4b 5f 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f  K_BYTE_PTR sign_
3970: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
3980: 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b  ong sign_buflen;
3990: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
39a0: 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73  sign_bufused;..s
39b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
39c0: 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e  ntity *sign_iden
39d0: 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72  tity;...int decr
39e0: 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ypt_active;..CK_
39f0: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64  MECHANISM_TYPE d
3a00: 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
3a10: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64  ;..CK_VOID_PTR d
3a20: 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
3a30: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72  ;..CK_ULONG decr
3a40: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e  ypt_mech_parmlen
3a50: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
3a60: 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79  _identity *decry
3a70: 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a  pt_identity;.};.
3a80: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  .struct cackey_s
3a90: 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76  lot {..int activ
3aa0: 65 3b 0a 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  e;...char *pcsc_
3ab0: 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63  reader;...int pc
3ac0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
3ad0: 64 3b 0a 09 53 43 41 52 44 48 41 4e 44 4c 45 20  d;..SCARDHANDLE 
3ae0: 70 63 73 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74  pcsc_card;...int
3af0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70   transaction_dep
3b00: 74 68 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72  th;...int slot_r
3b10: 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53  eset;...CK_FLAGS
3b20: 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 7d 3b   token_flags;.};
3b30: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
3b40: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
3b50: 5f 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c  _GENERIC = 0x01,
3b60: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
3b70: 5f 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c  _SKI     = 0x02,
3b80: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
3b90: 5f 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a  _PKI     = 0x04.
3ba0: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70  } cackey_tlv_app
3bb0: 74 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65  type;..typedef e
3bc0: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c  num {..CACKEY_TL
3bd0: 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49  V_OBJID_GENERALI
3be0: 4e 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30  NFO       = 0x20
3bf0: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
3c00: 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41  OBJID_PROPERSONA
3c10: 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30  LINFO   = 0x2100
3c20: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
3c30: 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f  JID_ACCESSCONTRO
3c40: 4c 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a  L     = 0x3000,.
3c50: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
3c60: 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20  D_LOGIN         
3c70: 20 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43      = 0x4000,..C
3c80: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3c90: 43 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20  CARDINFO        
3ca0: 20 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43    = 0x5000,..CAC
3cb0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49  KEY_TLV_OBJID_BI
3cc0: 4f 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20  OMETRICS        
3cd0: 3d 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x6000,..CACKE
3ce0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
3cf0: 54 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20  TALSIGCERT    = 
3d00: 30 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x7000,..CACKEY_
3d10: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
3d20: 52 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78  RSON        = 0x
3d30: 30 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0200,..CACKEY_TL
3d40: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45  V_OBJID_CAC_BENE
3d50: 46 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32  FITS      = 0x02
3d60: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
3d70: 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42  OBJID_CAC_OTHERB
3d80: 45 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33  ENEFITS = 0x0203
3d90: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
3da0: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45  JID_CAC_PERSONNE
3db0: 4c 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a  L     = 0x0201,.
3dc0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
3dd0: 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20  D_CAC_PKICERT   
3de0: 20 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63      = 0x02FE.} c
3df0: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
3e00: 69 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  id;..typedef enu
3e10: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  m {..CACKEY_PCSC
3e20: 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20  _S_TOKENPRESENT 
3e30: 20 20 20 3d 20 32 2c 0a 09 43 41 43 4b 45 59 5f     = 2,..CACKEY_
3e40: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_S_TOKENABSE
3e50: 4e 54 20 20 20 20 20 3d 20 31 2c 0a 09 43 41 43  NT     = 1,..CAC
3e60: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
3e70: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a             = 0,.
3e80: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  .CACKEY_PCSC_E_G
3e90: 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d  ENERIC         =
3ea0: 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -1,..CACKEY_PCS
3eb0: 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20  C_E_BADPIN      
3ec0: 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45      = -2,..CACKE
3ed0: 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20  Y_PCSC_E_LOCKED 
3ee0: 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 7d           = -3,.}
3ef0: 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74   cackey_ret;..st
3f00: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
3f10: 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67  cardurl {..unsig
3f20: 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20  ned char        
3f30: 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f  rid[5];..cackey_
3f40: 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 70  tlv_apptype   ap
3f50: 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74  ptype;..cackey_t
3f60: 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a  lv_objectid  obj
3f70: 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74  ectid;..cackey_t
3f80: 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70  lv_objectid  app
3f90: 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  id;..unsigned ch
3fa0: 61 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b  ar        pinid;
3fb0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  .};..struct cack
3fc0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73  ey_tlv_entity;.s
3fd0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
3fe0: 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38  _entity {..uint8
3ff0: 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20  _t tag;..size_t 
4000: 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20  length;...union 
4010: 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b  {...void *value;
4020: 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ...struct cackey
4030: 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61  _tlv_cardurl *va
4040: 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75  lue_cardurl;...u
4050: 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74  int8_t value_byt
4060: 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20  e;..};...struct 
4070: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
4080: 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a  y *_next;.};../*
4090: 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48   CACKEY Global H
40a0: 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63  andles */.static
40b0: 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69   void *cackey_bi
40c0: 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74  glock = NULL;.st
40d0: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
40e0: 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65  ey_session cacke
40f0: 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b  y_sessions[128];
4100: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
4110: 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65  ackey_slot cacke
4120: 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74  y_slots[128];.st
4130: 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
4140: 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
4150: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
4160: 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20  ey_biglock_init 
4170: 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41  = 0;.CK_C_INITIA
4180: 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79  LIZE_ARGS cackey
4190: 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50 43 53 43 20  _args;../* PCSC 
41a0: 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a  Global Handles *
41b0: 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52 44  /.static LPSCARD
41c0: 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f 70  CONTEXT cackey_p
41d0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
41e0: 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  L;..static unsig
41f0: 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f  ned long cackey_
4200: 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  getversion(void)
4210: 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69 67   {..static unsig
4220: 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20  ned long retval 
4230: 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64  = 255;..unsigned
4240: 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b   long major = 0;
4250: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
4260: 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72  minor = 0;..char
4270: 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55   *major_str = NU
4280: 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72  LL;..char *minor
4290: 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43  _str = NULL;...C
42a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
42b0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
42c0: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 32  .if (retval != 2
42d0: 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  55) {...CACKEY_D
42e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
42f0: 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63 61  urning 0x%lx (ca
4300: 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c 29  ched).", retval)
4310: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74 76  ;....return(retv
4320: 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  al);..}...retval
4330: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50 41   = 0;..#ifdef PA
4340: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20  CKAGE_VERSION.  
4350: 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20        major_str 
4360: 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  = PACKAGE_VERSIO
4370: 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74  N;..if (major_st
4380: 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d 61  r) {..        ma
4390: 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61  jor = strtoul(ma
43a0: 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f  jor_str, &minor_
43b0: 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20  str, 10);....if 
43c0: 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09  (minor_str) {...
43d0: 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c  .minor = strtoul
43e0: 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20  (minor_str + 1, 
43f0: 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09  NULL, 10);...}..
4400: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d 61  }...retval = (ma
4410: 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69  jor << 16) | (mi
4420: 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69  nor << 8);.#endi
4430: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
4440: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
4450: 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76 61  ng 0x%lx", retva
4460: 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
4470: 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53  val);.}../* PC/S
4480: 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  C Related Functi
4490: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
44a0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69  POSIS. *     voi
44b0: 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  d cackey_slots_d
44c0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f  isconnect_all(vo
44d0: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  id);. *. * ARGUM
44e0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ENTS. *     None
44f0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
4500: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
4510: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
4520: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
4530: 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f   disconnects fro
4540: 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a 0a  m all cards.. *.
4550: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
4560: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
4570: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64  connect_all(void
4580: 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
4590: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
45a0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
45b0: 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20  .");...for (idx 
45c0: 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
45d0: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
45e0: 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
45f0: 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78  _slots[0])); idx
4600: 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
4610: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
4620: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
4630: 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  d) {....CACKEY_D
4640: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
4650: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75  rdDisconnect(%lu
4660: 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69  ) called", (unsi
4670: 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b  gned long) idx);
4680: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
4690: 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74  nect(cackey_slot
46a0: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
46b0: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
46c0: 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  RD);...}....cack
46d0: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
46e0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
46f0: 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  d = 0;...cackey_
4700: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
4710: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
4720: 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  ;....if (cackey_
4730: 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76  slots[idx].activ
4740: 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  e) {....CACKEY_D
4750: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72  EBUG_PRINTF("Mar
4760: 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f 74  king active slot
4770: 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72 65   %lu as being re
4780: 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  set", (unsigned 
4790: 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d 0a  long) idx);...}.
47a0: 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
47b0: 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20  idx].slot_reset 
47c0: 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  = 1;..}...CACKEY
47d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
47e0: 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65  eturning");...re
47f0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  turn;.}../*. * S
4800: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
4810: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
4820: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f  _pcsc_connect(vo
4830: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  id);. *. * ARGUM
4840: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ENTS. *     None
4850: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
4860: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
4870: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
4880: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
4890: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
48a0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
48b0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
48c0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
48d0: 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74  function connect
48e0: 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43  s to the PC/SC C
48f0: 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65  onnection Manage
4900: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 74 68  r and updates th
4910: 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20  e. *     global 
4920: 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73  handle.. *. */.s
4930: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
4940: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
4950: 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f  nect(void) {..LO
4960: 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  NG scard_est_con
4970: 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65 66  text_ret;.#ifdef
4980: 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c   HAVE_SCARDISVAL
4990: 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20  IDCONTEXT..LONG 
49a0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
49b0: 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  t;.#endif...CACK
49c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
49d0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
49e0: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
49f0: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ndle == NULL) {.
4a00: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  ..cackey_pcsc_ha
4a10: 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  ndle = malloc(si
4a20: 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63 73  zeof(*cackey_pcs
4a30: 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66  c_handle));...if
4a40: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
4a50: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ndle == NULL) {.
4a60: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4a70: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20  PRINTF("Call to 
4a80: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c  malloc() failed,
4a90: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
4aa0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61 63  ilure");.....cac
4ab0: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
4ac0: 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09  nect_all();.....
4ad0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
4ae0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
4af0: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
4b00: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
4b10: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
4b20: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73  () called");...s
4b30: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
4b40: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61  _ret = SCardEsta
4b50: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41  blishContext(SCA
4b60: 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c  RD_SCOPE_SYSTEM,
4b70: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63   NULL, NULL, cac
4b80: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
4b90: 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73  ;...if (scard_es
4ba0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d  t_context_ret !=
4bb0: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
4bc0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
4bd0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
4be0: 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69   to SCardEstabli
4bf0: 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64  shContext failed
4c00: 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c   (returned %s/%l
4c10: 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  i), returning in
4c20: 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45   failure", CACKE
4c30: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
4c40: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
4c50: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
4c60: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
4c70: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4c80: 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63  t);.....free(cac
4c90: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
4ca0: 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  ;....cackey_pcsc
4cb0: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  _handle = NULL;.
4cc0: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
4cd0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
4ce0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
4cf0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
4d00: 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69  RIC);...}..}..#i
4d10: 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49  fdef HAVE_SCARDI
4d20: 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43  SVALIDCONTEXT..C
4d30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4d40: 54 46 28 22 53 43 61 72 64 49 73 56 61 6c 69 64  TF("SCardIsValid
4d50: 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64  Context() called
4d60: 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c  ");..scard_isval
4d70: 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73  id_ret = SCardIs
4d80: 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61  ValidContext(*ca
4d90: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4da0: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73  );..if (scard_is
4db0: 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41  valid_ret != SCA
4dc0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
4dd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4de0: 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61  RINTF("Handle ha
4df0: 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64  s become invalid
4e00: 20 28 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f   (SCardIsValidCo
4e10: 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c  ntext = %s/%li),
4e20: 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73   trying to re-es
4e30: 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43  tablish...", CAC
4e40: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
4e50: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
4e60: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
4e70: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
4e80: 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09  isvalid_ret);...
4e90: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
4ea0: 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62  INTF("SCardEstab
4eb0: 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61  lishContext() ca
4ec0: 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f  lled");...scard_
4ed0: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
4ee0: 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  = SCardEstablish
4ef0: 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43  Context(SCARD_SC
4f00: 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c  OPE_SYSTEM, NULL
4f10: 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70  , NULL, cackey_p
4f20: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69  csc_handle);...i
4f30: 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  f (scard_est_con
4f40: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
4f50: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
4f60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4f70: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53  RINTF("Call to S
4f80: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
4f90: 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74  text failed (ret
4fa0: 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72  urned %s/%li), r
4fb0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
4fc0: 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ure", CACKEY_DEB
4fd0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
4fe0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73  _TO_STR(scard_es
4ff0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20  t_context_ret), 
5000: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74  (long) scard_est
5010: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a  _context_ret);..
5020: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
5030: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09  csc_handle);....
5040: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5050: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63  le = NULL;.....c
5060: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
5070: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
5080: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5090: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
50a0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
50b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e  EBUG_PRINTF("Han
50c0: 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d  dle has been re-
50d0: 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09  established");..
50e0: 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  }.#endif...CACKE
50f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5100: 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e  Sucessfully conn
5110: 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20  ected to PC/SC, 
5120: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  returning in suc
5130: 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e  cess");...return
5140: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
5150: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
5160: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
5170: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
5180: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76  csc_disconnect(v
5190: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
51a0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
51b0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
51c0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
51d0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
51e0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
51f0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
5200: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
5210: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
5220: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
5230: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e   function discon
5240: 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50  nects from the P
5250: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
5260: 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61  manager and upda
5270: 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67  tes. *     the g
5280: 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a  lobal handle.. *
5290: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
52a0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
52b0: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f  sc_disconnect(vo
52c0: 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72  id) {..LONG scar
52d0: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
52e0: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
52f0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
5300: 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  .");...if (cacke
5310: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d  y_pcsc_handle ==
5320: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
5330: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
5340: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f  OK);..}...scard_
5350: 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  rel_context_ret 
5360: 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f  = SCardReleaseCo
5370: 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63  ntext(*cackey_pc
5380: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66  sc_handle);...if
5390: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
53a0: 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63  ndle) {...free(c
53b0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
53c0: 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70  e);.....cackey_p
53d0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
53e0: 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72  L;..}...if (scar
53f0: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
5400: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
5410: 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e  CESS) {...return
5420: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
5430: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72 65  ENERIC);..}...re
5440: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
5450: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
5460: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
5470: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5480: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
5490: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
54a0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
54b0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
54c0: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
54d0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
54e0: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
54f0: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
5500: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
5510: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
5520: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
5530: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
5540: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5550: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
5560: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
5570: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
5580: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
5590: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
55a0: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
55b0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
55c0: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
55d0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
55e0: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
55f0: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
5600: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
5610: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
5620: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
5630: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
5640: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
5650: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
5660: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
5670: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
5680: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5690: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
56a0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
56b0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
56c0: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
56d0: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
56e0: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
56f0: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
5700: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
5710: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
5720: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65  PC/SC failed, re
5730: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
5740: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
5750: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5760: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
5770: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65  Connect to reade
5780: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  r, if needed */.
5790: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63  .if (!slot->pcsc
57a0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
57b0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
57c0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
57d0: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65  onnect(%s) calle
57e0: 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  d", slot->pcsc_r
57f0: 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64 5f  eader);...scard_
5800: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
5810: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
5820: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
5830: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
5840: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
5850: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
5860: 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T0, &slot->pc
5870: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
5880: 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72  ol);....if (scar
5890: 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43  d_conn_ret != SC
58a0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
58b0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
58c0: 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
58d0: 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c  ion to card fail
58e0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
58f0: 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 43   failure (SCardC
5900: 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c  onnect() = %s/%l
5910: 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  i)", CACKEY_DEBU
5920: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
5930: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e  TO_STR(scard_con
5940: 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  n_ret), (long) s
5950: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a  card_conn_ret);.
5960: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
5970: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5980: 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e  );...}....slot->
5990: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
59a0: 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d  ted = 1;...slot-
59b0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
59c0: 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a 09 72 65 74  th = 0;..}...ret
59d0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
59e0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
59f0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
5a00: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
5a10: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
5a20: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
5a30: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
5a40: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5a50: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
5a60: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
5a70: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
5a80: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
5a90: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5aa0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
5ab0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
5ac0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
5ad0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
5ae0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
5af0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
5b00: 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61  *     The transa
5b10: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
5b20: 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67  terminated using
5b30: 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61   "cackey_end_tra
5b40: 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f  nsaction". *. */
5b50: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
5b60: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
5b70: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
5b80: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
5b90: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
5ba0: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ret cackey_conn_
5bb0: 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  ret;..LONG scard
5bc0: 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41  _trans_ret;...CA
5bd0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5be0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
5bf0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20  cackey_conn_ret 
5c00: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
5c10: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
5c20: 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65   (cackey_conn_re
5c30: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
5c40: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
5c50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5c60: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
5c70: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
5c80: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
5c90: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
5ca0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5cb0: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
5cc0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b  ansaction_depth+
5cd0: 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  +;...if (slot->t
5ce0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
5cf0: 20 3e 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59   > 1) {...CACKEY
5d00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
5d10: 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72 61 6e  lready in a tran
5d20: 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d  saction, perform
5d30: 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e  ing no action (n
5d40: 65 77 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c  ew depth = %i)",
5d50: 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69   slot->transacti
5d60: 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65  on_depth);....re
5d70: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
5d80: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61  _S_OK);..}...sca
5d90: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53  rd_trans_ret = S
5da0: 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63  CardBeginTransac
5db0: 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  tion(slot->pcsc_
5dc0: 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72  card);..if (scar
5dd0: 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53  d_trans_ret != S
5de0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
5df0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
5e00: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
5e10: 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63  to begin transac
5e20: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20  tion, returning 
5e30: 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72  in error");....r
5e40: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5e50: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
5e60: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5e70: 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75  PRINTF("Sucessfu
5e80: 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61  lly began transa
5e90: 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25  ction on slot (%
5ea0: 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  s)", slot->pcsc_
5eb0: 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72  reader);...retur
5ec0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
5ed0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
5ee0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
5ef0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
5f00: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
5f10: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5f20: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
5f30: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
5f40: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
5f50: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
5f60: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
5f70: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
5f80: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
5f90: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
5fa0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
5fb0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
5fc0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5fd0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
5fe0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
5ff0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
6000: 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65 79  requires "cackey
6010: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
6020: 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  on" to be called
6030: 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74   first. *. */.st
6040: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
6050: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
6060: 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61  action(struct ca
6070: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
6080: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74   {..LONG scard_t
6090: 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  rans_ret;...CACK
60a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
60b0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
60c0: 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61   (!slot->pcsc_ca
60d0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
60e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
60f0: 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e  RINTF("Card is n
6100: 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e  ot connected, un
6110: 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e  able to end tran
6120: 73 61 63 74 69 6f 6e 22 29 3b 0a 0a 09 09 72 65  saction");....re
6130: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6140: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
6150: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
6160: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d  saction_depth ==
6170: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
6180: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65 72  EBUG_PRINTF("Ter
6190: 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e 73  minating a trans
61a0: 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  action that has 
61b0: 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09  not begun!");...
61c0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
61d0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
61e0: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .}...slot->trans
61f0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a  action_depth--;.
6200: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
6210: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
6220: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
6230: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61 6e  BUG_PRINTF("Tran
6240: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69  sactions still i
6250: 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20  n progress, not 
6260: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63  terminating on-c
6270: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
6280: 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d  (current depth =
6290: 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61   %i)", slot->tra
62a0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b  nsaction_depth);
62b0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
62c0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
62d0: 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72  );..}...scard_tr
62e0: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ans_ret = SCardE
62f0: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  ndTransaction(sl
6300: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
6310: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
6320: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61  ;..if (scard_tra
6330: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  ns_ret != SCARD_
6340: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
6350: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6360: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e  TF("Unable to en
6370: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  d transaction, r
6380: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
6390: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
63a0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
63b0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
63c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
63d0: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72  "Sucessfully ter
63e0: 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74  minated transact
63f0: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29  ion on slot (%s)
6400: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  ", slot->pcsc_re
6410: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ader);...return(
6420: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6430: 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65  );.}../* APDU Re
6440: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20  lated Functions 
6450: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  */./*. * SYNPOSI
6460: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
6470: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  ret cackey_send_
6480: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b  apdu(struct cack
6490: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
64a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
64b0: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ss, unsigned cha
64c0: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75  r instruction, u
64d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c  nsigned char p1,
64e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
64f0: 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  2, unsigned char
6500: 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   lc, unsigned ch
6510: 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e  ar *data, unsign
6520: 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74  ed char le, uint
6530: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20  16_t *respcode, 
6540: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
6550: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20  espdata, size_t 
6560: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a  *respdata_len);.
6570: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
6580: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
6590: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
65a0: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
65b0: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
65c0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
65d0: 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20  char class. *   
65e0: 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73 73        APDU Class
65f0: 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53   (GSCIS_CLASS_IS
6600: 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43  O7816 or GSCIS_C
6610: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
6620: 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20  FORM. *         
6630: 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a  usually), (CLA).
6640: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
6650: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
6660: 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41  ion. *         A
6670: 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20  PDU Instruction 
6680: 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20  (INS). *. *     
6690: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
66a0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
66b0: 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50 31   Parameter 1 (P1
66c0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
66d0: 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20  gned char p2. * 
66e0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
66f0: 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a  ameter 2 (P2). *
6700: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
6710: 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20   char lc. *     
6720: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
6730: 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20  of Content (Lc) 
6740: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  -- this is the l
6750: 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a  ength of "data".
6760: 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61 6d   *         param
6770: 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61 22  eter.  If "data"
6780: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
6790: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61   NULL, this para
67a0: 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20  meter will. *   
67b0: 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64        be ignored
67c0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  .. *. *     unsi
67d0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a  gned char *data.
67e0: 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74   *         Point
67f0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20  er to buffer to 
6800: 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64  send.  It should
6810: 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c   be "Lc" bytes l
6820: 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20  ong.  If. *     
6830: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
6840: 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c   NULL, "Lc" will
6850: 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e   not be sent, an
6860: 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77 69  d this buffer wi
6870: 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20  ll be. *        
6880: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20   ignored.. *. * 
6890: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
68a0: 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20  r le. *         
68b0: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45  APDU Length of E
68c0: 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20  xpectation (Le) 
68d0: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  -- this is the l
68e0: 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20  ength of the. * 
68f0: 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 64          expected
6900: 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73   reply.  If this
6910: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
6920: 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20   0 then it will 
6930: 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62  not. *         b
6940: 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20  e sent.. *. *   
6950: 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70    uint16_t *resp
6960: 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20  code. *         
6970: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
6980: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
6990: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20   response code. 
69a0: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
69b0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
69c0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
69d0: 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c  sponse code will
69e0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
69f0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
6a00: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61  d char *respdata
6a10: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
6a20: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
6a30: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
6a40: 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20  ponse data.  If 
6a50: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
6a60: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
6a70: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
6a80: 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20  se data will be 
6a90: 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20  discarded.  If. 
6aa0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22 72  *         the "r
6ab0: 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72  espdata_len" par
6ac0: 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69 66  ameter is specif
6ad0: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69  ied as NULL, thi
6ae0: 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20  s buffer. *     
6af0: 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20      will not be 
6b00: 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20  updated.. *. *  
6b10: 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64     size_t *respd
6b20: 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20  ata_len. *      
6b30: 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69     [IN, OUT] Poi
6b40: 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20  nter initialing 
6b50: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
6b60: 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73 70  ize of the "resp
6b70: 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20  data". *        
6b80: 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65   buffer.  Before
6b90: 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20   returning, the 
6ba0: 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65  pointed to value
6bb0: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 74   is updated to t
6bc0: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75  he. *         nu
6bd0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
6be0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66  itten to the buf
6bf0: 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69 73  fer.  If this is
6c00: 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a   specified as. *
6c10: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69           NULL, i
6c20: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  t will not be up
6c30: 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70  dated, and "resp
6c40: 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67  data" will be ig
6c50: 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a  nored causing. *
6c60: 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73           the res
6c70: 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65  ponse data to be
6c80: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20   discarded.. *. 
6c90: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
6ca0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
6cb0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
6cc0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
6cd0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
6ce0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
6cf0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
6d00: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
6d10: 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74  ion will connect
6d20: 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f   to the PC/SC Co
6d30: 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72  nnection Manager
6d40: 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b   via. *     cack
6d50: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
6d60: 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a  ) if needed.. *.
6d70: 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63   *     It will c
6d80: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61  onnect to the ca
6d90: 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 65 72  rd in the reader
6da0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
6db0: 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65   slot. *     spe
6dc0: 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c  cified.  It will
6dd0: 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68   reconnect to th
6de0: 65 20 63 61 72 64 20 69 66 20 74 68 65 20 63 6f  e card if the co
6df0: 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20  nnection. *     
6e00: 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a  goes away.. *. *
6e10: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
6e20: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  ret cackey_send_
6e30: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b  apdu(struct cack
6e40: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
6e50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
6e60: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ss, unsigned cha
6e70: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75  r instruction, u
6e80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c  nsigned char p1,
6e90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
6ea0: 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  2, unsigned char
6eb0: 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   lc, unsigned ch
6ec0: 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e  ar *data, unsign
6ed0: 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74  ed char le, uint
6ee0: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20  16_t *respcode, 
6ef0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
6f00: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20  espdata, size_t 
6f10: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b  *respdata_len) {
6f20: 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f  ..uint8_t major_
6f30: 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73  rc, minor_rc;..s
6f40: 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63  ize_t bytes_to_c
6f50: 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74  opy, tmp_respdat
6f60: 61 5f 6c 65 6e 3b 0a 09 44 57 4f 52 44 20 70 72  a_len;..DWORD pr
6f70: 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20 78  otocol;..DWORD x
6f80: 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65  mit_len, recv_le
6f90: 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78  n;..LONG scard_x
6fa0: 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72  mit_ret, scard_r
6fb0: 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45  econn_ret;..BYTE
6fc0: 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c   xmit_buf[1024],
6fd0: 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b   recv_buf[1024];
6fe0: 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65  ..int pcsc_conne
6ff0: 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74  ct_ret, pcsc_get
7000: 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69  resp_ret;..int i
7010: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
7020: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
7030: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
7040: 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
7050: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
7060: 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69  lid slot specifi
7070: 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
7080: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
7090: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63  ENERIC);..}...pc
70a0: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
70b0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
70c0: 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20  card(slot);..if 
70d0: 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  (pcsc_connect_re
70e0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
70f0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
7100: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7110: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
7120: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
7130: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
7140: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
7150: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7160: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61  IC);..}.../* Tra
7170: 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c  nsmit */..xmit_l
7180: 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75  en = 0;..xmit_bu
7190: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
71a0: 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66  class;..xmit_buf
71b0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69  [xmit_len++] = i
71c0: 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69  nstruction;..xmi
71d0: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
71e0: 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75  ] = p1;..xmit_bu
71f0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
7200: 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b  p2;..if (data) {
7210: 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
7220: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09  _len++] = lc;...
7230: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
7240: 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b  x < lc; idx++) {
7250: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
7260: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b  t_len++] = data[
7270: 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  idx];...}..}...i
7280: 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b  f (le != 0x00) {
7290: 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
72a0: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d  _len++] = le;..}
72b0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72  .../* Begin Smar
72c0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
72d0: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67  n */..cackey_beg
72e0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
72f0: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73  lot);...if (clas
7300: 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53  s == GSCIS_CLASS
7310: 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73 74  _ISO7816 && inst
7320: 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53  ruction == GSCIS
7330: 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26 26  _INSTR_VERIFY &&
7340: 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20 70   p1 == 0x00 && p
7350: 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43  2 == 0x00) {...C
7360: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7370: 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  TF("Sending APDU
7380: 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29  : <<censored>>")
7390: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41  ;..} else {...CA
73a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
73b0: 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44  BUF("Sending APD
73c0: 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  U:", xmit_buf, x
73d0: 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72  mit_len);..}...r
73e0: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ecv_len = sizeof
73f0: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61  (recv_buf);..sca
7400: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43  rd_xmit_ret = SC
7410: 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74  ardTransmit(slot
7420: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7430: 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74 5f  RD_PCI_T0, xmit_
7440: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 53  buf, xmit_len, S
7450: 43 41 52 44 5f 50 43 49 5f 54 31 2c 20 72 65 63  CARD_PCI_T1, rec
7460: 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e  v_buf, &recv_len
7470: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  );..if (scard_xm
7480: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  it_ret != SCARD_
7490: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
74a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
74b0: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
74c0: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20  nd APDU to card 
74d0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29  (SCardTransmit()
74e0: 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43   = %s/%lx)", CAC
74f0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
7500: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
7510: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
7520: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
7530: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
7540: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7550: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20  PRINTF("Marking 
7560: 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62  slot as having b
7570: 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 0a 09 09  een reset");....
7580: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7590: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73  n_depth = 0;...s
75a0: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20  lot->slot_reset 
75b0: 3d 20 31 3b 0a 0a 09 09 69 66 20 28 73 63 61 72  = 1;....if (scar
75c0: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43  d_xmit_ret == SC
75d0: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
75e0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
75f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65  BUG_PRINTF("Rese
7600: 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61  t required, plea
7610: 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09  se hold...");...
7620: 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  ..scard_reconn_r
7630: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7640: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
7650: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
7660: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7670: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52  ROTOCOL_T0, SCAR
7680: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 70  D_RESET_CARD, &p
7690: 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 20  rotocol);....if 
76a0: 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  (scard_reconn_re
76b0: 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
76c0: 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52  CESS) {...../* R
76d0: 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e  e-establish tran
76e0: 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77  saction, if it w
76f0: 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09  as present */...
7700: 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
7710: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
7720: 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  0) {......slot->
7730: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
7740: 68 2d 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  h--;......cackey
7750: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
7760: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a  on(slot);.....}.
7770: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
7780: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
7790: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72  successful, retr
77a0: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 09 09  ansmitting");...
77b0: 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ..scard_xmit_ret
77c0: 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74   = SCardTransmit
77d0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
77e0: 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c 20  , SCARD_PCI_T0, 
77f0: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c  xmit_buf, xmit_l
7800: 65 6e 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 30  en, SCARD_PCI_T0
7810: 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63  , recv_buf, &rec
7820: 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20  v_len);......if 
7830: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  (scard_xmit_ret 
7840: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
7850: 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  SS) {......CACKE
7860: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7870: 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69 6c 65  Retransmit faile
7880: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
7890: 66 61 69 6c 75 72 65 20 61 66 74 65 72 20 64 69  failure after di
78a0: 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65 20  sconnecting the 
78b0: 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73  card (SCardTrans
78c0: 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20  mit = %s/%li)", 
78d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
78e0: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
78f0: 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  R(scard_xmit_ret
7900: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
7910: 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09  xmit_ret);......
7920: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
7930: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7940: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
7950: 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  RD);......slot->
7960: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
7970: 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09 2f  ted = 0;......./
7980: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
7990: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
79a0: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
79b0: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b  ction_depth = 1;
79c0: 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  ......cackey_end
79d0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
79e0: 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e  t);.......return
79f0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
7a00: 45 4e 45 52 49 43 29 3b 0a 09 09 09 09 7d 0a 09  ENERIC);.....}..
7a10: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
7a20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7a30: 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e  TF("Disconnectin
7a40: 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53  g card");......S
7a50: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
7a60: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7a70: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
7a80: 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73  );.....slot->pcs
7a90: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
7aa0: 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e   = 0;....../* En
7ab0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
7ac0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73  saction */.....s
7ad0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
7ae0: 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09  _depth = 1;.....
7af0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
7b00: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
7b10: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7b20: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
7b30: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
7b40: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
7b50: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
7b60: 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
7b70: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
7b80: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f  UG_PRINTF("Disco
7b90: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b  nnecting card");
7ba0: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
7bb0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
7bc0: 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45  card, SCARD_RESE
7bd0: 54 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74  T_CARD);....slot
7be0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
7bf0: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f  ected = 0;...../
7c00: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
7c10: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
7c20: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
7c30: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
7c40: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
7c50: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
7c60: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7c70: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
7c80: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
7c90: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
7ca0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
7cb0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  );...}..}...CACK
7cc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
7cd0: 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75  F("Returned Valu
7ce0: 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72  e:", recv_buf, r
7cf0: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  ecv_len);...if (
7d00: 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a  recv_len < 2) {.
7d10: 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73  ../* Minimal res
7d20: 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20  ponse length is 
7d30: 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69  2 bytes, returni
7d40: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f  ng in failure */
7d50: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7d60: 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
7d70: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75   too small, retu
7d80: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
7d90: 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75   (recv_len = %lu
7da0: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
7db0: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  ng) recv_len);..
7dc0: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
7dd0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
7de0: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  /...cackey_end_t
7df0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
7e00: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
7e10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7e20: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  C);..}.../* Dete
7e30: 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64  rmine result cod
7e40: 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d  e */..major_rc =
7e50: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c   recv_buf[recv_l
7e60: 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f  en - 2];..minor_
7e70: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
7e80: 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66  cv_len - 1];..if
7e90: 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09   (respcode) {...
7ea0: 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a  *respcode = (maj
7eb0: 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69  or_rc << 8) | mi
7ec0: 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20  nor_rc;..}.../* 
7ed0: 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62  Adjust message b
7ee0: 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c  uffer */..recv_l
7ef0: 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64  en -= 2;.../* Ad
7f00: 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72  d bytes to retur
7f10: 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f  n value */..tmp_
7f20: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30  respdata_len = 0
7f30: 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20  ;..if (respdata 
7f40: 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  && respdata_len)
7f50: 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74   {...tmp_respdat
7f60: 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74  a_len = *respdat
7f70: 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f  a_len;....bytes_
7f80: 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64  to_copy = *respd
7f90: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28  ata_len;....if (
7fa0: 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73  recv_len < bytes
7fb0: 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62  _to_copy) {....b
7fc0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72  ytes_to_copy = r
7fd0: 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ecv_len;...}....
7fe0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7ff0: 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75  NTF("Copying %lu
8000: 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75   bytes to the bu
8010: 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75  ffer (recv'd %lu
8020: 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79   bytes, but only
8030: 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20   %lu bytes left 
8040: 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c  in our buffer)",
8050: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
8060: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20   bytes_to_copy, 
8070: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
8080: 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67  recv_len, (unsig
8090: 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64  ned long) *respd
80a0: 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d  ata_len);....mem
80b0: 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65  cpy(respdata, re
80c0: 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f  cv_buf, bytes_to
80d0: 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61  _copy);...respda
80e0: 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63  ta += bytes_to_c
80f0: 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74  opy;....*respdat
8100: 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f  a_len = bytes_to
8110: 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73  _copy;...tmp_res
8120: 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74  pdata_len -= byt
8130: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65  es_to_copy;..} e
8140: 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76  lse {...if (recv
8150: 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09  _len != 0) {....
8160: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8170: 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77  NTF("Throwing aw
8180: 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f  ay %lu bytes, no
8190: 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65  where to put the
81a0: 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  m!", (unsigned l
81b0: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
81c0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a  ..}..}...if (maj
81d0: 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b  or_rc == 0x61) {
81e0: 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f  .../* We need to
81f0: 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45   READ */...CACKE
8200: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8210: 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75  Buffer read requ
8220: 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d  ired");....if (m
8230: 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29  inor_rc == 0x00)
8240: 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d   {....minor_rc =
8250: 20 32 35 33 3b 0a 09 09 7d 0a 0a 09 09 70 63 73   253;...}....pcs
8260: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20  c_getresp_ret = 
8270: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
8280: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
8290: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
82a0: 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50  S_INSTR_GET_RESP
82b0: 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30  ONSE, 0x00, 0x00
82c0: 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72  , 0, NULL, minor
82d0: 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72  _rc, respcode, r
82e0: 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65  espdata, &tmp_re
82f0: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 09 09 69  spdata_len);...i
8300: 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f  f (pcsc_getresp_
8310: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
8320: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
8330: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8340: 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20 66  F("Buffer read f
8350: 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 6e  ailed!  Returnin
8360: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
8370: 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
8380: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
8390: 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e   */....cackey_en
83a0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
83b0: 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ot);.....return(
83c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
83d0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69  NERIC);...}....i
83e0: 66 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  f (respdata_len)
83f0: 20 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61 5f   {....*respdata_
8400: 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64  len += tmp_respd
8410: 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ata_len;...}....
8420: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
8430: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
8440: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
8450: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
8460: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8470: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
8480: 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 62 75  g in success (bu
8490: 66 66 65 72 20 72 65 61 64 20 63 6f 6d 70 6c 65  ffer read comple
84a0: 74 65 29 22 29 3b 0a 09 09 72 65 74 75 72 6e 28  te)");...return(
84b0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
84c0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53  );..}.../* End S
84d0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
84e0: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
84f0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
8500: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a  slot);...if (maj
8510: 6f 72 5f 72 63 20 3d 3d 20 30 78 39 30 29 20 7b  or_rc == 0x90) {
8520: 0a 09 09 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f  .../* Success */
8530: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8540: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
8550: 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 6d 61  g in success (ma
8560: 6a 6f 72 5f 72 63 20 3d 20 30 78 39 30 29 22 29  jor_rc = 0x90)")
8570: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8580: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
8590: 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
85a0: 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 52  G_PRINTF("APDU R
85b0: 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
85c0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
85d0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75  ailure");...retu
85e0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
85f0: 5f 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a  _GENERIC);.}../*
8600: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
8610: 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b      ssize_t cack
8620: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
8630: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8640: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
8650: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
8660: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e  size_t count, un
8670: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
8680: 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69  _v, size_t initi
8690: 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20  al_offset);. *. 
86a0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
86b0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
86c0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
86d0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
86e0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
86f0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
8700: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a  ed char *buffer.
8710: 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d   *         [OUT]
8720: 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20   Buffer. *. *   
8730: 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20    size_t count. 
8740: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
8750: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74   of bytes to att
8760: 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a  empt to read. *.
8770: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
8780: 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20  char t_or_v. *  
8790: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 74 68         Select th
87a0: 65 20 54 2d 62 75 66 66 65 72 20 28 30 31 29 20  e T-buffer (01) 
87b0: 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30 32 29  or V-buffer (02)
87c0: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 20   to read from.  
87d0: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
87e0: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
87f0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70 65 63  . *         Spec
8800: 69 66 79 20 74 68 65 20 6f 66 66 73 65 74 20 74  ify the offset t
8810: 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65 61 64  o begin the read
8820: 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52   from. *. *. * R
8830: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
8840: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
8850: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
8860: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
8870: 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d  ually read, or -
8880: 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  1 on error.. *. 
8890: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
88a0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
88b0: 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
88c0: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72  _read_buffer(str
88d0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
88e0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
88f0: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
8900: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69  ze_t count, unsi
8910: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
8920: 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c  , size_t initial
8930: 5f 6f 66 66 73 65 74 29 20 7b 0a 09 73 69 7a 65  _offset) {..size
8940: 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d  _t offset = 0, m
8950: 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63  ax_offset, max_c
8960: 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ount;..unsigned 
8970: 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69  char cmd[2];..ui
8980: 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b  nt16_t respcode;
8990: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
89a0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
89b0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
89c0: 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d  ;...max_offset =
89d0: 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75   count;..max_cou
89e0: 6e 74 20 3d 20 32 35 32 3b 0a 0a 09 69 66 20 28  nt = 252;...if (
89f0: 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74  t_or_v != 1 && t
8a00: 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09  _or_v != 2) {...
8a10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8a20: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f  NTF("Invalid T o
8a30: 72 20 56 20 70 61 72 61 6d 65 74 65 72 20 73 70  r V parameter sp
8a40: 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69  ecified, returni
8a50: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
8a60: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
8a70: 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f  .}...cmd[0] = t_
8a80: 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31  or_v;...while (1
8a90: 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74  ) {...if (offset
8aa0: 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20   >= max_offset) 
8ab0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8ac0: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
8ad0: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75   too small, retu
8ae0: 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f  rning what we go
8af0: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61  t...");.....brea
8b00: 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20  k;...}....count 
8b10: 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f  = max_offset - o
8b20: 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75  ffset;...if (cou
8b30: 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20  nt > max_count) 
8b40: 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78  {....count = max
8b50: 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63  _count;...}....c
8b60: 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a  md[1] = count;..
8b70: 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
8b80: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
8b90: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
8ba0: 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c  GLOBAL_PLATFORM,
8bb0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41   GSCIS_INSTR_REA
8bc0: 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74  D_BUFFER, ((init
8bd0: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66  ial_offset + off
8be0: 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66  set) >> 8) & 0xf
8bf0: 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73  f, (initial_offs
8c00: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30  et + offset) & 0
8c10: 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  xff, sizeof(cmd)
8c20: 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65  , cmd, 0x00, &re
8c30: 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b  spcode, buffer +
8c40: 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29   offset, &count)
8c50: 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
8c60: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
8c70: 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72  S_OK) {....if (r
8c80: 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38  espcode == 0x6A8
8c90: 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78  6) {.....if (max
8ca0: 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09  _count == 1) {..
8cb0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
8cc0: 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20  ......max_count 
8cd0: 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b  = max_count / 2;
8ce0: 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
8cf0: 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ...}.....CACKEY_
8d00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
8d10: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29  ckey_send_apdu()
8d20: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
8d30: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
8d40: 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
8d50: 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b  ...}....offset +
8d60: 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28  = count;....if (
8d70: 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e  count < max_coun
8d80: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
8d90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f  EBUG_PRINTF("Sho
8da0: 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74  rt read -- count
8db0: 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20   = %i, cmd[1] = 
8dc0: 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74  %i", (int) count
8dd0: 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b  , (int) cmd[1]);
8de0: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
8df0: 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
8e00: 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
8e10: 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
8e20: 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74  _MAX..if (offset
8e30: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
8e40: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
8e50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66  DEBUG_PRINTF("Of
8e60: 66 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78  fset exceeds max
8e70: 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
8e80: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
8e90: 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66  . (max = %li, of
8ea0: 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c  fset = %lu)", (l
8eb0: 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
8ec0: 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
8ed0: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
8ee0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
8ef0: 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
8f00: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
8f10: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
8f20: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
8f30: 65 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20  ead %lu bytes", 
8f40: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
8f50: 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72  offset);...retur
8f60: 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  n(offset);.}../*
8f70: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
8f80: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
8f90: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
8fa0: 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  let(struct cacke
8fb0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
8fc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64  signed char *aid
8fd0: 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e  , size_t aid_len
8fe0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
8ff0: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
9000: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
9010: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
9020: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
9030: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
9040: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9050: 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42  aid. *         B
9060: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
9070: 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65   Applet ID to se
9080: 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73  lect. *. *     s
9090: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a  ize_t aid_len. *
90a0: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
90b0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
90c0: 22 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44  "aid" (Applet ID
90d0: 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20  ) parameter. *. 
90e0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
90f0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
9100: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
9110: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
9120: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
9130: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
9140: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
9150: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
9160: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
9170: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  ret cackey_selec
9180: 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20  t_applet(struct 
9190: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
91a0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
91b0: 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69   *aid, size_t ai
91c0: 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65  d_len) {..int se
91d0: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
91e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
91f0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b  alled.");...CACK
9200: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
9210: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70  F("Selecting app
9220: 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f  let:", aid, aid_
9230: 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74  len);...send_ret
9240: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
9250: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
9260: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
9270: 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43  SCIS_INSTR_SELEC
9280: 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53  T, GSCIS_PARAM_S
9290: 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78  ELECT_APPLET, 0x
92a0: 30 43 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64  0C, aid_len, aid
92b0: 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55  , 0x00, NULL, NU
92c0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  LL, NULL);..if (
92d0: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
92e0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
92f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9300: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
9310: 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65   open applet, re
9320: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
9330: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
9340: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9350: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
9360: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9370: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
9380: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
9390: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
93a0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
93b0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
93c0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
93d0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
93e0: 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  le(struct cackey
93f0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e  _slot *slot, uin
9400: 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a  t16_t ef);. *. *
9410: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
9420: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
9430: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
9440: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
9450: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
9460: 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f  *. *     uint16_
9470: 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20  t ef. *         
9480: 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74  Elemental File t
9490: 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52  o select. *. * R
94a0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
94b0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
94c0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
94d0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
94e0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
94f0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
9500: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
9510: 20 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20     This selects 
9520: 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69  an Elementary Fi
9530: 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68  le (EF) under th
9540: 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65  e currently sele
9550: 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69  cted. *     Dedi
9560: 63 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a  cated File (DF).
9570: 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61   *. *     Typica
9580: 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c  lly this is call
9590: 65 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69  ed after selecti
95a0: 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41  ng the correct A
95b0: 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20  pplet (using. * 
95c0: 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63      cackey_selec
95d0: 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d  t_applet) for VM
95e0: 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74   cards. *. */.st
95f0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
9600: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
9610: 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  le(struct cackey
9620: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e  _slot *slot, uin
9630: 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73  t16_t ef) {..uns
9640: 69 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62  igned char fid_b
9650: 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64  uf[2];..int send
9660: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
9670: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
9680: 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65  led.");.../* Ope
9690: 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79  n the elementary
96a0: 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75   file */..fid_bu
96b0: 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29  f[0] = (ef >> 8)
96c0: 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75   & 0xff;..fid_bu
96d0: 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66  f[1] = ef & 0xff
96e0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
96f0: 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69  _PRINTF("Selecti
9700: 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c  ng file: %04lx",
9710: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
9720: 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74   ef);...send_ret
9730: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
9740: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
9750: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
9760: 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43  SCIS_INSTR_SELEC
9770: 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73  T, 0x02, 0x0C, s
9780: 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20  izeof(fid_buf), 
9790: 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e  fid_buf, 0x00, N
97a0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
97b0: 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ;..if (send_ret 
97c0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
97d0: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
97e0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
97f0: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c  iled to open fil
9800: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
9810: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
9820: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
9830: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
9840: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9850: 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75  RINTF("Successfu
9860: 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c  lly selected fil
9870: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
9880: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
9890: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
98a0: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63  IS. *     void c
98b0: 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73  ackey_free_tlv(s
98c0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
98d0: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a  _entity *root);.
98e0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
98f0: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
9900: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
9910: 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *root. *        
9920: 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56   Root of the TLV
9930: 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66   list to start f
9940: 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54  reeing. *. * RET
9950: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
9960: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
9970: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
9980: 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65  nction frees the
9990: 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74   TLV linked list
99a0: 65 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  ed returned from
99b0: 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f  . *     "cackey_
99c0: 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f  read_tlv". *. */
99d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
99e0: 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72  key_free_tlv(str
99f0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
9a00: 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09  ntity *root) {..
9a10: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
9a20: 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20  v_entity *curr, 
9a30: 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f  *next;...if (roo
9a40: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
9a50: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
9a60: 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75  (curr = root; cu
9a70: 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29  rr; curr = next)
9a80: 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72   {...next = curr
9a90: 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74  ->_next;....swit
9aa0: 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b  ch (curr->tag) {
9ab0: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
9ac0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
9ad0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
9ae0: 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09  CERTIFICATE:....
9af0: 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65  .if (curr->value
9b00: 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
9b10: 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09  rr->value);.....
9b20: 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
9b30: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
9b40: 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28  ARDURL:.....if (
9b50: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
9b60: 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65  url) {......free
9b70: 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  (curr->value_car
9b80: 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09  durl);.....}....
9b90: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66  .break;...}....f
9ba0: 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09  ree(curr);..}...
9bb0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
9bc0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
9bd0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
9be0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
9bf0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
9c00: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
9c10: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
9c20: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
9c30: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
9c40: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63  _tlv_entity *cac
9c50: 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72  key_read_tlv(str
9c60: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9c70: 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *slot) {..struct
9c80: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
9c90: 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c  ty *curr_entity,
9ca0: 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a   *root = NULL, *
9cb0: 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e  last = NULL;..un
9cc0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e  signed char tlen
9cd0: 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75  _buf[2], tval_bu
9ce0: 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a  f[1024], *tval;.
9cf0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76  .unsigned char v
9d00: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c  len_buf[2], vval
9d10: 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61  _buf[8192], *vva
9d20: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  l;..unsigned cha
9d30: 72 20 2a 74 6d 70 62 75 66 3b 0a 09 73 73 69 7a  r *tmpbuf;..ssiz
9d40: 65 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a  e_t tlen, vlen;.
9d50: 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65  .ssize_t read_re
9d60: 74 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65  t;..size_t offse
9d70: 74 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65 74 5f  t_t = 0, offset_
9d80: 76 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64  v = 0;..unsigned
9d90: 20 63 68 61 72 20 74 61 67 3b 0a 09 73 69 7a 65   char tag;..size
9da0: 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66 64 65  _t length;.#ifde
9db0: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 75 4c 6f  f HAVE_LIBZ..uLo
9dc0: 6e 67 66 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09  ngf tmpbuflen;..
9dd0: 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  int uncompress_r
9de0: 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  et;.#endif...CAC
9df0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9e00: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72  ("Called.");...r
9e10: 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ead_ret = cackey
9e20: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f  _read_buffer(slo
9e30: 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69 7a  t, tlen_buf, siz
9e40: 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20 31  eof(tlen_buf), 1
9e50: 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66  , offset_t);..if
9e60: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69   (read_ret != si
9e70: 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29 20  zeof(tlen_buf)) 
9e80: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
9e90: 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 61  _PRINTF("Read fa
9ea0: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
9eb0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
9ec0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
9ed0: 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65 6e  }...tlen = (tlen
9ee0: 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20  _buf[1] << 8) | 
9ef0: 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72  tlen_buf[0];...r
9f00: 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ead_ret = cackey
9f10: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f  _read_buffer(slo
9f20: 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69 7a  t, vlen_buf, siz
9f30: 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20 32  eof(vlen_buf), 2
9f40: 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66  , offset_v);..if
9f50: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69   (read_ret != si
9f60: 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29 20  zeof(vlen_buf)) 
9f70: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
9f80: 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 61  _PRINTF("Read fa
9f90: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
9fa0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
9fb0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
9fc0: 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65 6e  }...vlen = (vlen
9fd0: 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20  _buf[1] << 8) | 
9fe0: 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43  vlen_buf[0];...C
9ff0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a000: 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20 3d  TF("Tag Length =
a010: 20 25 69 2c 20 56 61 6c 75 65 20 4c 65 6e 67 74   %i, Value Lengt
a020: 68 20 3d 20 25 69 22 2c 20 74 6c 65 6e 2c 20 76  h = %i", tlen, v
a030: 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f 74  len);...offset_t
a040: 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f 76   += 2;..offset_v
a050: 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c 65   += 2;...if (tle
a060: 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c 5f  n > sizeof(tval_
a070: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
a080: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
a090: 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ag length is too
a0a0: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
a0b0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a0c0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
a0d0: 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20 3e  ..}...if (vlen >
a0e0: 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75 66   sizeof(vval_buf
a0f0: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
a100: 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c 75  BUG_PRINTF("Valu
a110: 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f 20  e length is too 
a120: 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e 67  large, returning
a130: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
a140: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
a150: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
a160: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
a170: 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62 75  er(slot, tval_bu
a180: 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66 73  f, tlen, 1, offs
a190: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
a1a0: 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b 0a  _ret != tlen) {.
a1b0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a1c0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
a1d0: 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d 62   read entire T-b
a1e0: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
a1f0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
a200: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
a210: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
a220: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
a230: 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62 75  er(slot, vval_bu
a240: 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66 73  f, vlen, 2, offs
a250: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
a260: 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b 0a  _ret != vlen) {.
a270: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a280: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
a290: 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d 62   read entire V-b
a2a0: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
a2b0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
a2c0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
a2d0: 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61 6c  .}...tval = tval
a2e0: 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76 76  _buf;..vval = vv
a2f0: 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20 28  al_buf;..while (
a300: 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65 6e  tlen > 0 && vlen
a310: 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d 20   > 0) {...tag = 
a320: 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b  *tval;...tval++;
a330: 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66  ...tlen--;....if
a340: 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66 29   (*tval == 0xff)
a350: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 28   {....length = (
a360: 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c 20  tval[2] << 8) | 
a370: 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61 6c  tval[1];....tval
a380: 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20 2d   += 3;....tlen -
a390: 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 3;...} else {.
a3a0: 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76 61  ...length = *tva
a3b0: 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09 09  l;....tval++;...
a3c0: 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09  .tlen--;...}....
a3d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a3e0: 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25 30  NTF("Tag: %s (%0
a3f0: 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
a400: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
a410: 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67 6e  TR(tag), (unsign
a420: 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09 09  ed int) tag);...
a430: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a440: 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c 20  NTBUF("Value:", 
a450: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
a460: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
a470: 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20 28  NULL;...switch (
a480: 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20 47  tag) {....case G
a490: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
a4a0: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
a4b0: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
a4c0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
a4d0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
a4e0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
a4f0: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
a500: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  (*curr_entity->v
a510: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b 0a  alue_cardurl));.
a520: 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
a530: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
a540: 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76 61  ardurl->rid, vva
a550: 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72 5f  l, 5);.....curr_
a560: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
a570: 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 3d  rdurl->apptype =
a580: 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63 75   vval[5];.....cu
a590: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
a5a0: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
a5b0: 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c 3c  id = (vval[6] <<
a5c0: 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09   8) | vval[7];..
a5d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a5e0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
a5f0: 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d 20  ppid = (vval[8] 
a600: 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d 3b  << 8) | vval[9];
a610: 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ......curr_entit
a620: 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09  y->tag = tag;...
a630: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
a640: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
a650: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
a660: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
a670: 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f 65  ABLE:.....curr_e
a680: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
a690: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
a6a0: 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75 66  ty));.....tmpbuf
a6b0: 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68   = malloc(length
a6c0: 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 74  );......memcpy(t
a6d0: 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e  mpbuf, vval, len
a6e0: 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  gth);......curr_
a6f0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
a700: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
a710: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  ty->length = len
a720: 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  gth;.....curr_en
a730: 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
a740: 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
a750: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
a760: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
a770: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
a780: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  AG_CERTIFICATE:.
a790: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
a7a0: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
a7b0: 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
a7c0: 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
a7d0: 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09 09 09   length * 2;....
a7e0: 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  .tmpbuf = malloc
a7f0: 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 23 69  (tmpbuflen);..#i
a800: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09  fdef HAVE_LIBZ..
a810: 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
a820: 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28 74  t = uncompress(t
a830: 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c 65  mpbuf, &tmpbufle
a840: 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  n, vval, length)
a850: 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ;.....if (uncomp
a860: 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b  ress_ret != Z_OK
a870: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
a880: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
a890: 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72 65  iled to decompre
a8a0: 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28 29  ss, uncompress()
a8b0: 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d 20   returned %i -- 
a8c0: 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69 72  resorting to dir
a8d0: 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f 6d  ect copy", uncom
a8e0: 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09  press_ret);.....
a8f0: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65  ..tmpbuflen = le
a900: 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63 70  ngth;......memcp
a910: 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20  y(tmpbuf, vval, 
a920: 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a 0a  length);.....}..
a930: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a940: 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d  _PRINTBUF("Decom
a950: 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d  pressed to:", tm
a960: 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29  pbuf, tmpbuflen)
a970: 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43 4b  ;.#else.....CACK
a980: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a990: 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53 75  "Missing ZLIB Su
a9a0: 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72 74  pport, this cert
a9b0: 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65 6c  ificate is likel
a9c0: 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a  y useless...");.
a9d0: 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
a9e0: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65 6d   length;.....mem
a9f0: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
aa00: 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64 69  , length);.#endi
aa10: 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  f......curr_enti
aa20: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
aa30: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
aa40: 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66 6c  length = tmpbufl
aa50: 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  en;.....curr_ent
aa60: 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70  ity->value = tmp
aa70: 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  buf;.....curr_en
aa80: 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55  tity->_next = NU
aa90: 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  LL;......break;.
aaa0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
aab0: 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63 75  G_PKCS15:.....cu
aac0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
aad0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
aae0: 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 63  entity));......c
aaf0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
ab00: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
ab10: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62 79  entity->value_by
ab20: 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09 09  te = vval[0];...
ab30: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
ab40: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
ab50: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
ab60: 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a  vval += length;.
ab70: 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74 68  ..vlen -= length
ab80: 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65 6e  ;....if (curr_en
ab90: 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  tity != NULL) {.
aba0: 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e  ...if (root == N
abb0: 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74 20  ULL) {.....root 
abc0: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
abd0: 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73 74  ..}.....if (last
abe0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
abf0: 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63 75  last->_next = cu
ac00: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
ac10: 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72 5f  ....last = curr_
ac20: 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a  entity;...}..}..
ac30: 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d  .return(root);.}
ac40: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
ac50: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
ac60: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
ac70: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
ac80: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
ac90: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
aca0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
acb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
acc0: 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
acd0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
ace0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74  csc_identity *st
acf0: 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  art, size_t coun
ad00: 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61 72  t, int free_star
ad10: 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78  t) {..size_t idx
ad20: 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
ad30: 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69  ; idx < count; i
ad40: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74  dx++) {...if (st
ad50: 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
ad60: 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28  cate) {....free(
ad70: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
ad80: 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a  ficate);...}..}.
ad90: 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74  ..if (free_start
ada0: 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74  ) {...free(start
adb0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  );..}...return;.
adc0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
add0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
ade0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
adf0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
ae00: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
ae10: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
ae20: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
ae30: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
ae40: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
ae50: 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72  entity *cackey_r
ae60: 65 61 64 5f 63 65 72 74 73 28 73 74 72 75 63 74  ead_certs(struct
ae70: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
ae80: 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  ot, struct cacke
ae90: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
aea0: 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65 64  *certs, unsigned
aeb0: 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a   long *count) {.
aec0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
aed0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 75  csc_identity *cu
aee0: 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20 63  rr_id;..struct c
aef0: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
af00: 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f   *ccc_tlv, *ccc_
af10: 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20  curr, *app_tlv, 
af20: 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69  *app_curr;..unsi
af30: 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61 69  gned char ccc_ai
af40: 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44  d[] = {GSCIS_AID
af50: 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  _CCC};..unsigned
af60: 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37   char curr_aid[7
af70: 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ];..unsigned lon
af80: 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63  g outidx = 0;..c
af90: 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61  ackey_ret transa
afa0: 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 69 6e 74 20  ction_ret;..int 
afb0: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b  certs_resizable;
afc0: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20  ..int send_ret, 
afd0: 73 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09 43 41  select_ret;...CA
afe0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
aff0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
b000: 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c  if (count == NUL
b010: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
b020: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e  BUG_PRINTF("coun
b030: 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72  t is NULL, retur
b040: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
b050: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
b060: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72  L);..}...if (cer
b070: 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts != NULL) {...
b080: 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30 29  if (*count == 0)
b090: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
b0a0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
b0b0: 73 74 65 64 20 77 65 20 72 65 74 75 72 6e 20 30  sted we return 0
b0c0: 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d   objects, short-
b0d0: 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09 72  circuit");.....r
b0e0: 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09  eturn(certs);...
b0f0: 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20  }..}.../* Begin 
b100: 61 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e  a SmartCard tran
b110: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e  saction */..tran
b120: 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61  saction_ret = ca
b130: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
b140: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69  action(slot);..i
b150: 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72  f (transaction_r
b160: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
b170: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
b180: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b190: 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72  "Unable begin tr
b1a0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
b1b0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
b1c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
b1d0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72  L);..}...if (cer
b1e0: 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts == NULL) {...
b1f0: 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  certs = malloc(s
b200: 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20  izeof(*certs) * 
b210: 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35  5);...*count = 5
b220: 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  ;...certs_resiza
b230: 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65  ble = 1;..} else
b240: 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a   {...certs_resiz
b250: 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f  able = 0;..}.../
b260: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43  * Select the CCC
b270: 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64   Applet */..send
b280: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
b290: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
b2a0: 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f  , ccc_aid, sizeo
b2b0: 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66  f(ccc_aid));..if
b2c0: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
b2d0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
b2e0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
b2f0: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
b300: 74 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70  to select CCC Ap
b310: 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  plet, returning 
b320: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
b330: 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
b340: 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
b350: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
b360: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b370: 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  slot);....return
b380: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
b390: 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70  Read all the app
b3a0: 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43  lets from the CC
b3b0: 43 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63 63 5f  C's TLV */..ccc_
b3c0: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
b3d0: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f  d_tlv(slot);.../
b3e0: 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55  * Look for CARDU
b3f0: 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70  RLs that cooresp
b400: 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65  ond to PKI apple
b410: 74 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63 63 5f  ts */..for (ccc_
b420: 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20  curr = ccc_tlv; 
b430: 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75  ccc_curr; ccc_cu
b440: 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f  rr = ccc_curr->_
b450: 6e 65 78 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  next) {...CACKEY
b460: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
b470: 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e  ound tag: %s ...
b480: 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47   ", CACKEY_DEBUG
b490: 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
b4a0: 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29  (ccc_curr->tag))
b4b0: 3b 0a 0a 09 09 69 66 20 28 63 63 63 5f 63 75 72  ;....if (ccc_cur
b4c0: 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f  r->tag != GSCIS_
b4d0: 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09  TAG_CARDURL) {..
b4e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b4f0: 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69  RINTF("  ... ski
b500: 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c  pping it (we onl
b510: 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 41 52  y care about CAR
b520: 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 63 6f  DURLs)");.....co
b530: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
b540: 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  f ((ccc_curr->va
b550: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
b560: 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54 4c  type & CACKEY_TL
b570: 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43 41  V_APP_PKI) != CA
b580: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
b590: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
b5a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
b5b0: 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
b5c0: 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
b5d0: 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74  t PKI applets, t
b5e0: 68 69 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f  his applet suppo
b5f0: 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20  rts: %s/%02x)", 
b600: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
b610: 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
b620: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
b630: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
b640: 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  e), (unsigned in
b650: 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  t) ccc_curr->val
b660: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
b670: 79 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  ype);.....contin
b680: 75 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  ue;...}....CACKE
b690: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
b6a0: 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72  ("RID:", ccc_cur
b6b0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
b6c0: 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  ->rid, sizeof(cc
b6d0: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
b6e0: 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09  rdurl->rid));...
b6f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b700: 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73 2f  NTF("AppID = %s/
b710: 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
b720: 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
b730: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
b740: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
b750: 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e 65  appid), (unsigne
b760: 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72  d long) ccc_curr
b770: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
b780: 3e 61 70 70 69 64 29 3b 0a 09 09 43 41 43 4b 45  >appid);...CACKE
b790: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b7a0: 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30  ObjectID = %s/%0
b7b0: 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  4lx", CACKEY_DEB
b7c0: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
b7d0: 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76  _STR(ccc_curr->v
b7e0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
b7f0: 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e  jectid), (unsign
b800: 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
b810: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
b820: 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09  ->objectid);....
b830: 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c  memcpy(curr_aid,
b840: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
b850: 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73  _cardurl->rid, s
b860: 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e  izeof(ccc_curr->
b870: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
b880: 69 64 29 29 3b 0a 09 09 63 75 72 72 5f 61 69 64  id));...curr_aid
b890: 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
b8a0: 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75  ) - 2] = (ccc_cu
b8b0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b8c0: 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26  l->appid >> 8) &
b8d0: 20 30 78 66 66 3b 0a 09 09 63 75 72 72 5f 61 69   0xff;...curr_ai
b8e0: 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  d[sizeof(curr_ai
b8f0: 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75  d) - 1] = ccc_cu
b900: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b910: 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b  l->appid & 0xff;
b920: 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f  ..../* Select fo
b930: 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a  und applet ... *
b940: 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  /...select_ret =
b950: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
b960: 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72  pplet(slot, curr
b970: 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72  _aid, sizeof(cur
b980: 72 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28 73  r_aid));...if (s
b990: 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  elect_ret != CAC
b9a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
b9b0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b9c0: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
b9d0: 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74  to select applet
b9e0: 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65  , skipping proce
b9f0: 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62  ssing of this ob
ba00: 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74  ject");.....cont
ba10: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20  inue;...}..../* 
ba20: 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20 28  ... and object (
ba30: 66 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c 65 63  file) */...selec
ba40: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
ba50: 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c  elect_file(slot,
ba60: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
ba70: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
ba80: 69 64 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63  id);...if (selec
ba90: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
baa0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
bab0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bac0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
bad0: 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70  elect file, skip
bae0: 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20  ping processing 
baf0: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29  of this object")
bb00: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
bb10: 09 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63 65 73  ..}..../* Proces
bb20: 73 20 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c  s this file's TL
bb30: 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65  V looking for ce
bb40: 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09  rtificates */...
bb50: 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  app_tlv = cackey
bb60: 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
bb70: 0a 0a 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72  ....for (app_cur
bb80: 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70  r = app_tlv; app
bb90: 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20  _curr; app_curr 
bba0: 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78  = app_curr->_nex
bbb0: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
bbc0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
bbd0: 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43  nd tag: %s", CAC
bbe0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54  KEY_DEBUG_FUNC_T
bbf0: 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75  AG_TO_STR(app_cu
bc00: 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 69 66  rr->tag));....if
bc10: 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20   (app_curr->tag 
bc20: 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  != GSCIS_TAG_CER
bc30: 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
bc40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bc50: 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
bc60: 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
bc70: 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54 49  care about CERTI
bc80: 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09  FICATEs)");.....
bc90: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
bca0: 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63  ....curr_id = &c
bcb0: 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09  erts[outidx];...
bcc0: 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d  .outidx++;.....m
bcd0: 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 61  emcpy(curr_id->a
bce0: 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 2c  pplet, curr_aid,
bcf0: 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d   sizeof(curr_id-
bd00: 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 63 75  >applet));....cu
bd10: 72 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20 63 63  rr_id->file = cc
bd20: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
bd30: 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b  rdurl->objectid;
bd40: 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6c 61 62  ....curr_id->lab
bd50: 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 75  el = NULL;....cu
bd60: 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d  rr_id->keysize =
bd70: 20 2d 31 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f   -1;.....CACKEY_
bd80: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69  DEBUG_PRINTF("Fi
bd90: 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 61  lling curr_id->a
bda0: 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 68 20  pplet (%p) with 
bdb0: 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72  %lu bytes:", cur
bdc0: 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 28 75  r_id->applet, (u
bdd0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
bde0: 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70  zeof(curr_id->ap
bdf0: 70 6c 65 74 29 29 3b 0a 09 09 09 43 41 43 4b 45  plet));....CACKE
be00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
be10: 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64  ("VAL:", curr_id
be20: 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66  ->applet, sizeof
be30: 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74  (curr_id->applet
be40: 29 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  ));.....curr_id-
be50: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
be60: 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e   = app_curr->len
be70: 67 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64  gth;.....curr_id
be80: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ->certificate = 
be90: 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e  malloc(curr_id->
bea0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
beb0: 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  ;....memcpy(curr
bec0: 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
bed0: 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75  , app_curr->valu
bee0: 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  e, curr_id->cert
bef0: 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
bf00: 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20  ..if (outidx >= 
bf10: 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 69 66  *count) {.....if
bf20: 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c   (certs_resizabl
bf30: 65 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74  e) {......*count
bf40: 20 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65 72 74   *= 2;......cert
bf50: 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74  s = realloc(cert
bf60: 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  s, sizeof(*certs
bf70: 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09  ) * (*count));..
bf80: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
bf90: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
bfa0: 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  .}...}....cackey
bfb0: 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c  _free_tlv(app_tl
bfc0: 76 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74 69 64  v);....if (outid
bfd0: 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09  x >= *count) {..
bfe0: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a  ..break;...}..}.
bff0: 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c  ..cackey_free_tl
c000: 76 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09 2a 63  v(ccc_tlv);...*c
c010: 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a  ount = outidx;..
c020: 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a  .if (certs_resiz
c030: 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20  able) {...certs 
c040: 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c  = realloc(certs,
c050: 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20   sizeof(*certs) 
c060: 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a  * (*count));..}.
c070: 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53  ../* Terminate S
c080: 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63  martCard Transac
c090: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
c0a0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
c0b0: 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  slot);...return(
c0c0: 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  certs);.}../*. *
c0d0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
c0e0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
c0f0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
c100: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
c110: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
c120: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
c130: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
c140: 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65  ic ssize_t cacke
c150: 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 74  y_signdecrypt(st
c160: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
c170: 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63   *slot, struct c
c180: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
c190: 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e  identity, unsign
c1a0: 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69  ed char *buf, si
c1b0: 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73  ze_t buflen, uns
c1c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62  igned char *outb
c1d0: 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75  uf, size_t outbu
c1e0: 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70  flen, int padInp
c1f0: 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74  ut, int unpadOut
c200: 70 75 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  put) {..unsigned
c210: 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a   char *tmpbuf, *
c220: 74 6d 70 62 75 66 5f 73 3b 0a 09 75 6e 73 69 67  tmpbuf_s;..unsig
c230: 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f 74  ned char bytes_t
c240: 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a 09 75 6e 73  o_send, p1;..uns
c250: 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b  igned char block
c260: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65  type;..cackey_re
c270: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e  t send_ret;..uin
c280: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
c290: 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20  .ssize_t retval 
c2a0: 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74  = 0, unpadoffset
c2b0: 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66  ;..size_t tmpbuf
c2c0: 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70  len, padlen, tmp
c2d0: 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20  outbuflen;..int 
c2e0: 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 2c  free_tmpbuf = 0,
c2f0: 20 73 65 70 42 79 74 65 20 3d 20 2d 31 3b 0a 09   sepByte = -1;..
c300: 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59  int le;...CACKEY
c310: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
c320: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
c330: 62 75 66 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a  buflen > 255) {.
c340: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c350: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62  RINTF("Error.  b
c360: 75 66 6c 65 6e 20 69 73 20 67 72 65 61 74 65 72  uflen is greater
c370: 20 74 68 61 6e 20 32 35 35 20 28 62 75 66 6c 65   than 255 (bufle
c380: 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  n = %lu)", (unsi
c390: 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65  gned long) bufle
c3a0: 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  n);....return(-1
c3b0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
c3c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
c3d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c3e0: 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20  F("Error.  slot 
c3f0: 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
c400: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
c410: 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  f (buf == NULL) 
c420: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c430: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
c440: 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a   buf is NULL");.
c450: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c460: 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d  }...if (outbuf =
c470: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
c480: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c490: 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20  "Error.  outbuf 
c4a0: 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
c4b0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
c4c0: 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
c4d0: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
c4e0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
c4f0: 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69  ror.  identity i
c500: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
c510: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
c520: 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
c530: 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  _identity == NUL
c540: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
c550: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
c560: 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
c570: 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e  sc_identity is N
c580: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
c590: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  (-1);..}.../* De
c5a0: 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79  termine identity
c5b0: 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   Key size */..if
c5c0: 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
c5d0: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
c5e0: 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e  ze < 0) {...iden
c5f0: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
c600: 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78  ity->keysize = x
c610: 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69  509_to_keysize(i
c620: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
c630: 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
c640: 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ate, identity->p
c650: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
c660: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
c670: 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73  .}.../* Pad mess
c680: 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20  age to key size 
c690: 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74  */..if (padInput
c6a0: 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69  ) {...if (identi
c6b0: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
c6c0: 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20  y->keysize > 0) 
c6d0: 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  {....if (buflen 
c6e0: 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  != identity->pcs
c6f0: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
c700: 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62  ize) {.....if (b
c710: 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74  uflen > (identit
c720: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
c730: 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29 20  ->keysize + 3)) 
c740: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
c750: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
c760: 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74  r.  Message is t
c770: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e  oo large to sign
c780: 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09  /decrypt");.....
c790: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
c7a0: 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ..}......tmpbufl
c7b0: 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  en = identity->p
c7c0: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
c7d0: 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75  ysize;.....tmpbu
c7e0: 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
c7f0: 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f  flen);.....free_
c800: 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09  tmpbuf = 1;.....
c810: 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66  .padlen = tmpbuf
c820: 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33  len - buflen - 3
c830: 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d  ;......tmpbuf[0]
c840: 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70   = 0x00;.....tmp
c850: 62 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09  buf[1] = 0x01;..
c860: 09 09 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75  ...memset(&tmpbu
c870: 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c  f[2], 0xFF, padl
c880: 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b  en);.....tmpbuf[
c890: 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30  padlen + 2]= 0x0
c8a0: 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74  0;.....memcpy(&t
c8b0: 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33  mpbuf[padlen + 3
c8c0: 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ], buf, buflen);
c8d0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
c8e0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70  UG_PRINTBUF("Unp
c8f0: 61 64 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75  added:", buf, bu
c900: 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45  flen);.....CACKE
c910: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
c920: 28 22 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62  ("Padded:", tmpb
c930: 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  uf, tmpbuflen);.
c940: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
c950: 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09  tmpbuf = buf;...
c960: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75  ..tmpbuflen = bu
c970: 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74  flen;.....free_t
c980: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70  mpbuf = 0;.....p
c990: 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a  adlen = 0;....}.
c9a0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
c9b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c9c0: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74  F("Unable to det
c9d0: 65 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c  ermine key size,
c9e0: 20 68 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73   hoping the mess
c9f0: 61 67 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20  age is properly 
ca00: 70 61 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74  padded!");.....t
ca10: 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09  mpbuf = buf;....
ca20: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
ca30: 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62  en;....free_tmpb
ca40: 75 66 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65  uf = 0;....padle
ca50: 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n = 0;...}..} el
ca60: 73 65 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20  se {...tmpbuf = 
ca70: 62 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e  buf;...tmpbuflen
ca80: 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65   = buflen;...fre
ca90: 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
caa0: 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a  padlen = 0;..}..
cab0: 09 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61  ./* Begin transa
cac0: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
cad0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
cae0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53  on(slot);.../* S
caf0: 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20 61 70  elect correct ap
cb00: 70 6c 65 74 20 2a 2f 0a 09 43 41 43 4b 45 59 5f  plet */..CACKEY_
cb10: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
cb20: 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66  lecting applet f
cb30: 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c  ound at %p ...",
cb40: 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
cb50: 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74  identity->applet
cb60: 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63  );..cackey_selec
cb70: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69  t_applet(slot, i
cb80: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
cb90: 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 2c 20  entity->applet, 
cba0: 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d  sizeof(identity-
cbb0: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
cbc0: 61 70 70 6c 65 74 29 29 3b 0a 0a 09 2f 2a 20 53  applet));.../* S
cbd0: 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20 66 69  elect correct fi
cbe0: 6c 65 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 73 65  le */..cackey_se
cbf0: 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20  lect_file(slot, 
cc00: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
cc10: 64 65 6e 74 69 74 79 2d 3e 66 69 6c 65 29 3b 0a  dentity->file);.
cc20: 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70  ..tmpbuf_s = tmp
cc30: 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70  buf;..while (tmp
cc40: 62 75 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20 28  buflen) {...if (
cc50: 74 6d 70 62 75 66 6c 65 6e 20 3e 20 32 34 35 29  tmpbuflen > 245)
cc60: 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73   {....bytes_to_s
cc70: 65 6e 64 20 3d 20 32 34 35 3b 0a 09 09 09 70 31  end = 245;....p1
cc80: 20 3d 20 30 78 38 30 3b 0a 09 09 09 6c 65 20 3d   = 0x80;....le =
cc90: 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20   0x00;...} else 
cca0: 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65  {....bytes_to_se
ccb0: 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  nd = tmpbuflen;.
ccc0: 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09  ...p1 = 0x00;...
ccd0: 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d 0a  .le = 0x00;...}.
cce0: 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20  ...tmpoutbuflen 
ccf0: 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09  = outbuflen;....
cd00: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
cd10: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
cd20: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c  , GSCIS_CLASS_GL
cd30: 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47  OBAL_PLATFORM, G
cd40: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
cd50: 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30  ECRYPT, p1, 0x00
cd60: 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  , bytes_to_send,
cd70: 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65   tmpbuf, le, &re
cd80: 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20  spcode, outbuf, 
cd90: 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a  &tmpoutbuflen);.
cda0: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
cdb0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
cdc0: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
cdd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
cde0: 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65  PU Sending Faile
cdf0: 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69  d -- returning i
ce00: 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09  n error.");.....
ce10: 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20  if (respcode == 
ce20: 30 78 36 39 38 32 29 20 7b 0a 09 09 09 09 43 41  0x6982) {.....CA
ce30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ce40: 46 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74  F("Security stat
ce50: 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65  us not satisifie
ce60: 64 2e 22 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  d.");....}.....i
ce70: 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20  f (free_tmpbuf) 
ce80: 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66  {.....if (tmpbuf
ce90: 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  _s) {......free(
cea0: 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d  tmpbuf_s);.....}
ceb0: 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64  ....}...../* End
cec0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
ced0: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
cee0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
cef0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
cf00: 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b  ...}....tmpbuf +
cf10: 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b  = bytes_to_send;
cf20: 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20  ...tmpbuflen -= 
cf30: 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a  bytes_to_send;..
cf40: 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f  ..outbuf += tmpo
cf50: 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62  utbuflen;...outb
cf60: 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62  uflen -= tmpoutb
cf70: 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20  uflen;...retval 
cf80: 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b  += tmpoutbuflen;
cf90: 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 74  ..}...if (free_t
cfa0: 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28 74  mpbuf) {...if (t
cfb0: 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66 72  mpbuf_s) {....fr
cfc0: 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09  ee(tmpbuf_s);...
cfd0: 7d 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 74 72  }..}.../* End tr
cfe0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
cff0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
d000: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66  tion(slot);..#if
d010: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e  def CACKEY_PARAN
d020: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f  OID.#  ifdef _PO
d030: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69  SIX_SSIZE_MAX..i
d040: 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f  f (outbuflen > _
d050: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29  POSIX_SSIZE_MAX)
d060: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
d070: 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62 75 66  G_PRINTF("Outbuf
d080: 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61 78 69  len exceeds maxi
d090: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
d0a0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
d0b0: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74   (max = %li, out
d0c0: 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20  buflen = %lu)", 
d0d0: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
d0e0: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
d0f0: 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c  ed long) outbufl
d100: 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  en);....return(-
d110: 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a  1);..}.#  endif.
d120: 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 55 6e 70 61  #endif.../* Unpa
d130: 64 20 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28  d reply */..if (
d140: 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09  unpadOutput) {..
d150: 09 69 66 20 28 72 65 74 76 61 6c 20 3c 20 32 29  .if (retval < 2)
d160: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
d170: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79  UG_PRINTF("Reply
d180: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77   is too small, w
d190: 65 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74  e are not able t
d1a0: 6f 20 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69  o unpad -- passi
d1b0: 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69  ng back and hopi
d1c0: 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21  ng for the best!
d1d0: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 72  ");.....return(r
d1e0: 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62  etval);...}....b
d1f0: 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74 62 75  locktype = outbu
d200: 66 5b 30 5d 3b 0a 09 09 75 6e 70 61 64 6f 66 66  f[0];...unpadoff
d210: 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77 69 74  set = 0;....swit
d220: 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 29 20 7b  ch (blocktype) {
d230: 0a 09 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09  ....case 0x00:..
d240: 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63  .../* Padding Sc
d250: 68 65 6d 65 20 31 2c 20 74 68 65 20 66 69 72 73  heme 1, the firs
d260: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 20  t non-zero byte 
d270: 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  is the start of 
d280: 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f 72 20  data */.....for 
d290: 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 31  (unpadoffset = 1
d2a0: 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20  ; unpadoffset < 
d2b0: 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66  retval; unpadoff
d2c0: 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  set++) {......if
d2d0: 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
d2e0: 66 73 65 74 5d 20 21 3d 20 30 78 30 30 29 20 7b  fset] != 0x00) {
d2f0: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
d300: 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62  ...}.....}.....b
d310: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
d320: 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  01:...../* Paddi
d330: 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 70 61 64  ng Scheme 2, pad
d340: 20 62 79 74 65 73 20 61 72 65 20 30 78 46 46 20   bytes are 0xFF 
d350: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78 30 30  followed by 0x00
d360: 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70   */.....for (unp
d370: 61 64 6f 66 66 73 65 74 20 3d 20 31 3b 20 75 6e  adoffset = 1; un
d380: 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76  padoffset < retv
d390: 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b  al; unpadoffset+
d3a0: 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75  +) {......if (ou
d3b0: 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
d3c0: 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a 09 09 09  ] != 0xFF) {....
d3d0: 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
d3e0: 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78  padoffset] == 0x
d3f0: 30 30 29 20 7b 0a 09 09 09 09 09 09 09 75 6e 70  00) {........unp
d400: 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09  adoffset++;.....
d410: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
d420: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
d430: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d440: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61  INTF("Invalid pa
d450: 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64  dding data found
d460: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
d470: 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68  ailure, should h
d480: 61 76 65 20 62 65 65 6e 20 30 78 30 30 20 66 6f  ave been 0x00 fo
d490: 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e  und 0x%02x", (un
d4a0: 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62  signed int) outb
d4b0: 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29  uf[unpadoffset])
d4c0: 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 75 72 6e  ;.........return
d4d0: 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09  (-1);.......}...
d4e0: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
d4f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d500: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70  RINTF("Invalid p
d510: 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75 6e  adding data foun
d520: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
d530: 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20  failure, should 
d540: 68 61 76 65 20 62 65 65 6e 20 30 78 46 46 20 66  have been 0xFF f
d550: 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28 75  ound 0x%02x", (u
d560: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 74  nsigned int) out
d570: 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
d580: 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 75 72 6e  );........return
d590: 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09  (-1);......}....
d5a0: 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
d5b0: 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 09  .case 0x02:.....
d5c0: 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d  /* Padding Schem
d5d0: 65 20 33 2c 20 70 61 64 20 62 79 74 65 73 20 61  e 3, pad bytes a
d5e0: 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69 72 73  re non-zero firs
d5f0: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 20  t non-zero byte 
d600: 66 6f 75 6e 64 20 69 73 20 74 68 65 20 70 61 64  found is the pad
d610: 20 62 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72   byte */.....for
d620: 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
d630: 31 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c  1; unpadoffset <
d640: 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66   retval; unpadof
d650: 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69  fset++) {......i
d660: 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
d670: 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20  ffset] == 0x00) 
d680: 7b 0a 09 09 09 09 09 09 63 6f 6e 74 69 6e 75 65  {.......continue
d690: 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
d6a0: 66 20 28 73 65 70 42 79 74 65 20 3d 3d 20 2d 31  f (sepByte == -1
d6b0: 29 20 7b 0a 09 09 09 09 09 09 73 65 70 42 79 74  ) {.......sepByt
d6c0: 65 20 3d 20 6f 75 74 62 75 66 5b 75 6e 70 61 64  e = outbuf[unpad
d6d0: 6f 66 66 73 65 74 5d 3b 0a 0a 09 09 09 09 09 09  offset];........
d6e0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09 7d  continue;......}
d6f0: 0a 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75  .......if (outbu
d700: 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d  f[unpadoffset] =
d710: 3d 20 73 65 70 42 79 74 65 29 20 7b 0a 09 09 09  = sepByte) {....
d720: 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  ...unpadoffset++
d730: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
d740: 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
d750: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69  .break;...}....i
d760: 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e  f (unpadoffset >
d770: 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41   retval) {....CA
d780: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d790: 46 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65  F("Offset greate
d7a0: 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a  r than reply siz
d7b0: 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75  e, aborting.  (u
d7c0: 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75  npadoffset = %lu
d7d0: 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22  , retval = %lu)"
d7e0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
d7f0: 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28  ) unpadoffset, (
d800: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
d810: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
d820: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43  rn(-1);...}....C
d830: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d840: 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20  TBUF("Padded:", 
d850: 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b  outbuf, retval);
d860: 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e  ....retval -= un
d870: 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d  padoffset;...mem
d880: 6d 6f 76 65 28 6f 75 74 62 75 66 20 2b 20 75 6e  move(outbuf + un
d890: 70 61 64 6f 66 66 73 65 74 2c 20 6f 75 74 62 75  padoffset, outbu
d8a0: 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43  f, retval);....C
d8b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d8c0: 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22  TBUF("Unpadded:"
d8d0: 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c  , outbuf, retval
d8e0: 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f  );..}....CACKEY_
d8f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
d900: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
d910: 73 73 2c 20 73 69 67 6e 65 64 20 25 6c 69 20 62  ss, signed %li b
d920: 79 74 65 73 22 2c 20 28 6c 6f 6e 67 29 20 72 65  ytes", (long) re
d930: 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
d940: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20  retval);.}../*. 
d950: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
d960: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
d970: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
d980: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
d990: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
d9a0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
d9b0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
d9c0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
d9d0: 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75  ackey_login(stru
d9e0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d9f0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
da00: 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e  har *pin, unsign
da10: 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c  ed long pin_len,
da20: 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61   int *tries_rema
da30: 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69  ining_p) {..unsi
da40: 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70 69  gned char cac_pi
da50: 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78  n[8] = {0xFF, 0x
da60: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
da70: 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
da80: 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36  , 0xFF};..uint16
da90: 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  _t response_code
daa0: 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
dab0: 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e  aining;..int sen
dac0: 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69  d_ret;.../* Indi
dad0: 63 61 74 65 20 74 68 61 74 20 77 65 20 64 6f 20  cate that we do 
dae0: 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68  not know about h
daf0: 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72  ow many tries ar
db00: 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09  e remaining */..
db10: 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e  if (tries_remain
db20: 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65  ing_p) {...*trie
db30: 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20  s_remaining_p = 
db40: 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61  -1;..}.../* Appa
db50: 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73  rently, CAC PINs
db60: 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38   are *EXACTLY* 8
db70: 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70   bytes long -- p
db80: 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66 20  ad with 0xFF if 
db90: 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
dba0: 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20   (pin_len >= 8) 
dbb0: 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
dbc0: 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20  in, pin, 8);..} 
dbd0: 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
dbe0: 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69  cac_pin, pin, pi
dbf0: 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  n_len);..}.../* 
dc00: 49 73 73 75 65 20 50 49 4e 20 56 65 72 69 66 79  Issue PIN Verify
dc10: 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
dc20: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
dc30: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
dc40: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
dc50: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20  S_INSTR_VERIFY, 
dc60: 30 78 30 30 2c 20 30 78 30 30 2c 20 73 69 7a 65  0x00, 0x00, size
dc70: 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63  of(cac_pin), cac
dc80: 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73  _pin, 0x00, &res
dc90: 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c  ponse_code, NULL
dca0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65  , NULL);..if (se
dcb0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
dcc0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
dcd0: 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f  if ((response_co
dce0: 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20  de & 0x63C0) == 
dcf0: 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69  0x63C0) {....tri
dd00: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28  es_remaining = (
dd10: 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20  response_code & 
dd20: 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  0xF);.....CACKEY
dd30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
dd40: 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
dd50: 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73  failed, %i tries
dd60: 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69   remaining", tri
dd70: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a  es_remaining);..
dd80: 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  ...if (tries_rem
dd90: 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09  aining_p) {.....
dda0: 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  *tries_remaining
ddb0: 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69  _p = tries_remai
ddc0: 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  ning;....}.....r
ddd0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
dde0: 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d  C_E_BADPIN);...}
ddf0: 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65  ....if (response
de00: 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29  _code == 0x6983)
de10: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
de20: 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
de30: 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c  erification fail
de40: 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f  ed, device is lo
de50: 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75  cked");.....retu
de60: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
de70: 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09  _LOCKED);...}...
de80: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
de90: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
dea0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
deb0: 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
dec0: 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65  rification succe
ded0: 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  eded");...return
dee0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
def0: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
df00: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
df10: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
df20: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
df30: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
df40: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
df50: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
df60: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
df70: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
df80: 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73  _token_present(s
df90: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
dfa0: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 75 6e 73 69  t *slot) {..unsi
dfb0: 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61 69  gned char ccc_ai
dfc0: 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44  d[] = {GSCIS_AID
dfd0: 5f 43 43 43 7d 3b 0a 09 69 6e 74 20 73 65 6e 64  _CCC};..int send
dfe0: 5f 72 65 74 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63  _ret;.../* Selec
dff0: 74 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74  t the CCC Applet
e000: 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
e010: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
e020: 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61  plet(slot, ccc_a
e030: 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61  id, sizeof(ccc_a
e040: 69 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  id));..if (send_
e050: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
e060: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 72 65 74  SC_S_OK) {...ret
e070: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
e080: 53 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  S_TOKENABSENT);.
e090: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
e0a0: 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
e0b0: 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20  RESENT);.}../*. 
e0c0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
e0d0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
e0e0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
e0f0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
e100: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
e110: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
e120: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
e130: 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
e140: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
e150: 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74  _to_label(struct
e160: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
e170: 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
e180: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
e190: 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67  label_buf, unsig
e1a0: 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62  ned long label_b
e1b0: 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  uf_len) {..unsig
e1c0: 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69  ned long certifi
e1d0: 63 61 74 65 5f 6c 65 6e 3b 0a 09 63 68 61 72 20  cate_len;..char 
e1e0: 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f  *label_asn1;..vo
e1f0: 69 64 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  id *certificate;
e200: 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f  ..int x509_read_
e210: 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61  ret;...certifica
e220: 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  te = identity->c
e230: 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72  ertificate;..cer
e240: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69  tificate_len = i
e250: 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
e260: 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28  cate_len;...if (
e270: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
e280: 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
e290: 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72  -1);..}...x509_r
e2a0: 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
e2b0: 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66  o_subject(certif
e2c0: 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
e2d0: 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a  te_len, (void **
e2e0: 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a  ) &label_asn1);.
e2f0: 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
e300: 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  et < 0) {...retu
e310: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30  rn(-1);..}...x50
e320: 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
e330: 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
e340: 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
e350: 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
e360: 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
e370: 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e  bel_buf_len, "CN
e380: 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  ");..if (x509_re
e390: 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
e3a0: 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
e3b0: 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
e3c0: 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
e3d0: 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
e3e0: 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
e3f0: 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
e400: 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78   NULL);....if (x
e410: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
e420: 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d  0) {....return(-
e430: 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  1);...}..}..#ifd
e440: 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
e450: 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
e460: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
e470: 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
e480: 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
e490: 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
e4a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30  EBUG_PRINTF("x50
e4b0: 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65 65  9_read_ret excee
e4c0: 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
e4d0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
e4e0: 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
e4f0: 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  li, x509_read_re
e500: 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67  t = %lu)", (long
e510: 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  ) _POSIX_SSIZE_M
e520: 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  AX, (unsigned lo
e530: 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65  ng) x509_read_re
e540: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
e550: 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
e560: 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78  endif...return(x
e570: 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d  509_read_ret);.}
e580: 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
e590: 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
e5a0: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
e5b0: 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64  utex_create(void
e5c0: 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68   **mutex) {..pth
e5d0: 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
e5e0: 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
e5f0: 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
e600: 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
e610: 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
e620: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
e630: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
e640: 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
e650: 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
e660: 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
e670: 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
e680: 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
e690: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
e6a0: 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29  *pthread_mutex))
e6b0: 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65 61 64  ;...if (!pthread
e6c0: 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43  _mutex) {....CAC
e6d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e6e0: 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f  ("Failed to allo
e6f0: 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a  cate memory.");.
e700: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
e710: 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ..}....pthread_r
e720: 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
e730: 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65  mutex_init(pthre
e740: 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b  ad_mutex, NULL);
e750: 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
e760: 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
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 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
e790: 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72  tex_init() retur
e7a0: 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
e7b0: 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
e7c0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
e7d0: 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78  );...}....*mutex
e7e0: 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
e7f0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
e800: 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72   (cackey_args.Cr
e810: 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09  eateMutex) {....
e820: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
e830: 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
e840: 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  teMutex(mutex);.
e850: 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
e860: 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
e870: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
e880: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
e890: 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
e8a0: 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
e8b0: 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
e8c0: 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
e8d0: 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
e8e0: 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
e8f0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
e900: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
e910: 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
e920: 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
e930: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
e940: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
e950: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
e960: 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f  ey_mutex_lock(vo
e970: 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74  id *mutex) {..pt
e980: 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
e990: 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69  thread_mutex;..i
e9a0: 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  nt pthread_retva
e9b0: 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d  l;..CK_RV custom
e9c0: 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
e9d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e9e0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
e9f0: 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ((cackey_args.fl
ea00: 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags & CKF_OS_LOC
ea10: 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f  KING_OK) == CKF_
ea20: 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b  OS_LOCKING_OK) {
ea30: 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
ea40: 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68   = mutex;....pth
ea50: 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
ea60: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
ea70: 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b  (pthread_mutex);
ea80: 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
ea90: 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
eaa0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
eab0: 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
eac0: 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72  tex_lock() retur
ead0: 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
eae0: 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
eaf0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
eb00: 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
eb10: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
eb20: 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a  gs.LockMutex) {.
eb30: 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
eb40: 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c   = cackey_args.L
eb50: 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
eb60: 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
eb70: 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
eb80: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
eb90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
eba0: 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
ebb0: 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
ebc0: 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
ebd0: 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
ebe0: 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
ebf0: 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
ec00: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ec10: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
ec20: 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
ec30: 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
ec40: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
ec50: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
ec60: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
ec70: 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76  y_mutex_unlock(v
ec80: 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70  oid *mutex) {..p
ec90: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
eca0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
ecb0: 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
ecc0: 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
ecd0: 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
ece0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ecf0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
ed00: 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
ed10: 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
ed20: 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
ed30: 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
ed40: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
ed50: 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74  x = mutex;....pt
ed60: 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
ed70: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
ed80: 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65  ock(pthread_mute
ed90: 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  x);...if (pthrea
eda0: 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
edb0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
edc0: 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
edd0: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20  _mutex_unlock() 
ede0: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
edf0: 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
ee00: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
ee10: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65  rn(-1);...}..} e
ee20: 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
ee30: 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
ee40: 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
ee50: 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
ee60: 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
ee70: 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
ee80: 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
ee90: 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
eea0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
eeb0: 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
eec0: 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20  s.UnlockMutex() 
eed0: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
eee0: 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
eef0: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
ef00: 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
ef10: 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
ef20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ef30: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
ef40: 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
ef50: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
ef60: 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42  static CK_ATTRIB
ef70: 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67  UTE_PTR cackey_g
ef80: 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
ef90: 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62  _OBJECT_CLASS ob
efa0: 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63  jectclass, struc
efb0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
efc0: 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
efd0: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
efe0: 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b  identity_num, CK
eff0: 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
f000: 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43  unt) {..static C
f010: 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20  K_BBOOL ck_true 
f020: 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  = 1;..static CK_
f030: 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d  BBOOL ck_false =
f040: 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75   0;..CK_ULONG nu
f050: 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74 76  mattrs = 0, retv
f060: 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54  al_count;..CK_AT
f070: 54 52 49 42 55 54 45 5f 54 59 50 45 20 63 75 72  TRIBUTE_TYPE cur
f080: 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b  r_attr_type;..CK
f090: 5f 41 54 54 52 49 42 55 54 45 20 63 75 72 72 5f  _ATTRIBUTE curr_
f0a0: 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09  attr, *retval;..
f0b0: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c  CK_VOID_PTR pVal
f0c0: 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ue;..CK_ULONG ul
f0d0: 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42  ValueLen;..CK_OB
f0e0: 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62  JECT_CLASS ck_ob
f0f0: 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f  ject_class;..CK_
f100: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
f110: 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f   ck_certificate_
f120: 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59  type;..CK_KEY_TY
f130: 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a  PE ck_key_type;.
f140: 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63 54  .CK_UTF8CHAR ucT
f150: 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 75 6e  mpBuf[1024];..un
f160: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
f170: 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a 65  tificate;..ssize
f180: 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  _t certificate_l
f190: 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65  en = -1, x509_re
f1a0: 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56 61  ad_ret;..int pVa
f1b0: 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b  lue_free;...CACK
f1c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f1d0: 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43  "Called (objectC
f1e0: 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e  lass = %lu, iden
f1f0: 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e  tity_num = %lu).
f200: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
f210: 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20  g) objectclass, 
f220: 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a  identity_num);..
f230: 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
f240: 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
f250: 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  ATE && objectcla
f260: 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
f270: 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
f280: 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41  ass != CKO_PRIVA
f290: 54 45 5f 4b 45 59 29 20 7b 0a 09 09 43 41 43 4b  TE_KEY) {...CACK
f2a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f2b0: 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a  "Returning 0 obj
f2c0: 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76  ects (NULL), inv
f2d0: 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 73  alid object clas
f2e0: 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  s");....return(N
f2f0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65  ULL);..}.../* Ge
f300: 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 69  t Cert */..if (i
f310: 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29  dentity == NULL)
f320: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
f330: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
f340: 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
f350: 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 64  ULL), invalid id
f360: 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22 29  entiy provided")
f370: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
f380: 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 63  );..}...certific
f390: 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  ate = identity->
f3a0: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65  certificate;..ce
f3b0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
f3c0: 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
f3d0: 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20  icate_len;...if 
f3e0: 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
f3f0: 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 66   == -1 || certif
f400: 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  icate == NULL) {
f410: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f420: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
f430: 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
f440: 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69 74  L), this identit
f450: 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
f460: 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  an X.509 certifi
f470: 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 20  cate associated 
f480: 77 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c 6c  with it and will
f490: 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09   not work");....
f4a0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
f4b0: 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
f4c0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  t certificate is
f4d0: 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58   ASN.1 encoded X
f4e0: 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
f4f0: 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 6f   */..if (x509_to
f500: 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63  _serial(certific
f510: 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
f520: 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29  _len, NULL) < 0)
f530: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
f540: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
f550: 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
f560: 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 20  ULL), the X.509 
f570: 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73 6f  certificate asso
f580: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
f590: 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74   identity is not
f5a0: 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74   valid");....ret
f5b0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
f5c0: 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 31  retval_count = 1
f5d0: 36 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c  6;..retval = mal
f5e0: 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74  loc(retval_count
f5f0: 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
f600: 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72  l));...for (curr
f610: 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b 20  _attr_type = 0; 
f620: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3c  curr_attr_type <
f630: 20 30 78 63 65 35 33 36 33 35 66 3b 20 63 75 72   0xce53635f; cur
f640: 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b  r_attr_type++) {
f650: 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
f660: 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29 20  _type == 0x800) 
f670: 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f 74  {....curr_attr_t
f680: 79 70 65 20 3d 20 30 78 63 65 35 33 36 33 30 30  ype = 0xce536300
f690: 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f  ;...}....pValue_
f6a0: 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c  free = 0;...pVal
f6b0: 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56  ue = NULL;...ulV
f6c0: 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
f6d0: 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63  NG) -1;....switc
f6e0: 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  h (curr_attr_typ
f6f0: 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41  e) {....case CKA
f700: 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 4b  _CLASS:.....CACK
f710: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f720: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
f730: 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 20  ibute CKA_CLASS 
f740: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
f750: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f760: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
f770: 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f  ......ck_object_
f780: 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c  class = objectcl
f790: 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  ass;......pValue
f7a0: 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c   = &ck_object_cl
f7b0: 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ass;.....ulValue
f7c0: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
f7d0: 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a  object_class);..
f7e0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f7f0: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
f800: 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
f810: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
f820: 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a   long) *((CK_OBJ
f830: 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 61  ECT_CLASS *) pVa
f840: 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
f850: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
f860: 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
f870: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
f880: 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41  KA_TOKEN:.....CA
f890: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f8a0: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
f8b0: 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45  tribute CKA_TOKE
f8c0: 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  N (0x%08lx) ..."
f8d0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
f8e0: 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
f8f0: 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
f900: 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
f910: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
f920: 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
f930: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f940: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
f950: 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
f960: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
f970: 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
f980: 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
f990: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
f9a0: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
f9b0: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
f9c0: 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49  .case CKA_MODIFI
f9d0: 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABLE:.....CACKEY
f9e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
f9f0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
fa00: 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42  ute CKA_MODIFIAB
fa10: 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  LE (0x%08lx) ...
fa20: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
fa30: 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
fa40: 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
fa50: 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
fa60: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
fa70: 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
fa80: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
fa90: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
faa0: 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
fab0: 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
fac0: 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
fad0: 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
fae0: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
faf0: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
fb00: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
fb10: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42  ....case CKA_LAB
fb20: 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  EL:.....CACKEY_D
fb30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
fb40: 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
fb50: 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25  e CKA_LABEL (0x%
fb60: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
fb70: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
fb80: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
fb90: 09 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6e  ../* Determine n
fba0: 61 6d 65 20 2a 2f 0a 09 09 09 09 78 35 30 39 5f  ame */.....x509_
fbb0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
fbc0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f  y_pcsc_identity_
fbd0: 74 6f 5f 6c 61 62 65 6c 28 69 64 65 6e 74 69 74  to_label(identit
fbe0: 79 2c 20 75 63 54 6d 70 42 75 66 2c 20 73 69 7a  y, ucTmpBuf, siz
fbf0: 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29 3b 0a  eof(ucTmpBuf));.
fc00: 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
fc10: 64 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09  d_ret > 0) {....
fc20: 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70  ..pValue = ucTmp
fc30: 42 75 66 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  Buf;......ulValu
fc40: 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
fc50: 5f 72 65 74 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  _ret;.....}.....
fc60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
fc70: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
fc80: 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
fc90: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
fca0: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
fcb0: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
fcc0: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ....case CKA_VAL
fcd0: 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  UE:.....CACKEY_D
fce0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
fcf0: 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
fd00: 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78 25  e CKA_VALUE (0x%
fd10: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
fd20: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
fd30: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
fd40: 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63 74  ..switch (object
fd50: 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63 61  class) {......ca
fd60: 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  se CKO_PRIVATE_K
fd70: 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  EY:.......CACKEY
fd80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
fd90: 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
fda0: 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
fdb0: 65 20 61 72 65 20 61 20 70 72 69 76 61 74 65 20  e are a private 
fdc0: 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62  key.");........b
fdd0: 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
fde0: 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a  CKO_PUBLIC_KEY:.
fdf0: 09 09 09 09 09 09 2f 2a 20 58 58 58 3a 20 54 4f  ....../* XXX: TO
fe00: 44 4f 20 2a 2f 0a 0a 09 09 09 09 09 09 62 72 65  DO */........bre
fe10: 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ak;......case CK
fe20: 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  O_CERTIFICATE:..
fe30: 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63 65  .....pValue = ce
fe40: 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09  rtificate;......
fe50: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63 65  .ulValueLen = ce
fe60: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
fe70: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
fe80: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
fe90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
fea0: 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
feb0: 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
fec0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
fed0: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
fee0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
fef0: 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43 41  A_ISSUER:.....CA
ff00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ff10: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
ff20: 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53 55  tribute CKA_ISSU
ff30: 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
ff40: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
ff50: 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
ff60: 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
ff70: 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
ff80: 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
ff90: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ffa0: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
ffb0: 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
ffc0: 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
ffd0: 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
ffe0: 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  e.");.......brea
fff0: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
10000 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
10010 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
10020 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
10030 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65  509_to_issuer(ce
10040 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
10050 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
10060 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
10070 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
10080 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
10090 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
100a0 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
100b0 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
100c0 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
100d0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
100e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
100f0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
10100 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
10110 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10120 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
10130 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
10140 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
10150 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
10160 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
10170 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
10180 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d  e CKA_SERIAL_NUM
10190 42 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BER (0x%08lx) ..
101a0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
101b0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
101c0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
101d0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
101e0 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
101f0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10200 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
10210 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
10220 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
10230 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
10240 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  te.");.......bre
10250 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
10260 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
10270 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
10280 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
10290 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63  x509_to_serial(c
102a0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
102b0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
102c0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
102d0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
102e0 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
102f0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
10300 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
10310 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
10320 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
10330 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
10340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10350 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
10360 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
10370 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
10380 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
10390 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
103a0 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a  ase CKA_SUBJECT:
103b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
103c0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
103d0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
103e0 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78 25 30  KA_SUBJECT (0x%0
103f0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
10400 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
10410 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
10420 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
10430 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
10440 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ATE) {......CACK
10450 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10460 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
10470 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
10480 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
10490 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09  rtificate.");...
104a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
104b0 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
104c0 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
104d0 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
104e0 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73  _ret = x509_to_s
104f0 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61  ubject(certifica
10500 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
10510 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
10520 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
10530 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
10540 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
10550 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
10560 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
10570 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
10580 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
10590 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
105a0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
105b0 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
105c0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
105d0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
105e0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
105f0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 44  ;....case CKA_ID
10600 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
10610 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
10620 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
10630 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c 78 29  CKA_ID (0x%08lx)
10640 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
10650 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
10660 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 75 63 54  _type);......ucT
10670 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65  mpBuf[0] = ((ide
10680 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e  ntity_num + 1) >
10690 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09  > 8) & 0xff;....
106a0 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20  .ucTmpBuf[1] =  
106b0 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20  (identity_num + 
106c0 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09  1) & 0xff;......
106d0 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42  pValue = &ucTmpB
106e0 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  uf;.....ulValueL
106f0 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43  en = 2;......CAC
10700 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10710 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
10720 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
10730 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10740 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
10750 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
10760 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41  se CKA_CERTIFICA
10770 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43  TE_TYPE:.....CAC
10780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10790 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
107a0 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49  ribute CKA_CERTI
107b0 46 49 43 41 54 45 5f 54 59 50 45 20 28 30 78 25  FICATE_TYPE (0x%
107c0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
107d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
107e0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
107f0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
10800 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
10810 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43  CATE) {......CAC
10820 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10830 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
10840 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
10850 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
10860 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a  ertificate.");..
10870 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
10880 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c  }....../* We onl
10890 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65  y support one ce
108a0 72 74 69 66 69 63 61 74 65 20 74 79 70 65 20 2a  rtificate type *
108b0 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69  /.....ck_certifi
108c0 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f  cate_type = CKC_
108d0 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c  X_509;......pVal
108e0 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69  ue = &ck_certifi
108f0 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75  cate_type;.....u
10900 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
10910 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74  of(ck_certificat
10920 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41  e_type);......CA
10930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10940 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
10950 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75  g CKC_X_509 (%lu
10960 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  ) (%p/%lu)", (un
10970 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
10980 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  CK_CERTIFICATE_T
10990 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  YPE *) pValue), 
109a0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
109b0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
109c0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
109d0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59  ....case CKA_KEY
109e0 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45  _TYPE:.....CACKE
109f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10a00 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
10a10 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50  bute CKA_KEY_TYP
10a20 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
10a30 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10a40 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
10a50 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
10a60 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
10a70 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62  RIVATE_KEY && ob
10a80 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
10a90 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09  _PUBLIC_KEY) {..
10aa0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10ab0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
10ac0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
10ad0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
10ae0 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09  not a key.");...
10af0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
10b00 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79  ....../* We only
10b10 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79   support one key
10b20 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f   type */.....ck_
10b30 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52  key_type = CKK_R
10b40 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  SA;......pValue 
10b50 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a  = &ck_key_type;.
10b60 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
10b70 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74   sizeof(ck_key_t
10b80 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ype);......CACKE
10b90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10ba0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43   ... returning C
10bb0 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70  KK_RSA (%lu) (%p
10bc0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
10bd0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45  d long) *((CK_CE
10be0 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a  RTIFICATE_TYPE *
10bf0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
10c00 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
10c10 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
10c20 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
10c30 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09  ase CKA_SIGN:...
10c40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10c50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
10c60 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
10c70 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  SIGN (0x%08lx) .
10c80 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
10c90 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
10ca0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
10cb0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
10cc0 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b  O_PRIVATE_KEY) {
10cd0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
10ce0 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
10cf0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
10d00 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
10d10 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
10d20 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
10d30 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
10d40 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
10d50 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
10d60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10d70 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
10d80 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
10d90 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
10da0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
10db0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
10dc0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
10dd0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
10de0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10df0 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54  case CKA_DECRYPT
10e00 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
10e10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
10e20 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
10e30 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30 78 25  CKA_DECRYPT (0x%
10e40 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
10e50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
10e60 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
10e70 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
10e80 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
10e90 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c  _KEY || objectcl
10ea0 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass == CKO_PUBLI
10eb0 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  C_KEY) {......pV
10ec0 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
10ed0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
10ee0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
10ef0 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
10f00 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
10f10 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
10f20 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
10f30 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
10f40 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
10f50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
10f60 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
10f70 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
10f80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
10f90 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
10fa0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
10fb0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
10fc0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
10fd0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
10fe0 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
10ff0 54 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  TH:.....CACKEY_D
11000 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
11010 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
11020 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56  e CKA_TRUST_SERV
11030 45 52 5f 41 55 54 48 20 28 30 78 25 30 38 6c 78  ER_AUTH (0x%08lx
11040 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
11050 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
11060 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
11070 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
11080 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
11090 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
110a0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
110b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
110c0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
110d0 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
110e0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
110f0 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
11100 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
11110 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
11120 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
11130 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
11140 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54  TRUST_CLIENT_AUT
11150 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  H:.....CACKEY_DE
11160 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
11170 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
11180 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e   CKA_TRUST_CLIEN
11190 54 5f 41 55 54 48 20 28 30 78 25 30 38 6c 78 29  T_AUTH (0x%08lx)
111a0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
111b0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
111c0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
111d0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
111e0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
111f0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
11200 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
11210 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
11220 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
11230 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
11240 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
11250 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
11260 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
11270 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
11280 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
11290 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
112a0 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e  RUST_CODE_SIGNIN
112b0 47 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  G:.....CACKEY_DE
112c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
112d0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
112e0 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f   CKA_TRUST_CODE_
112f0 53 49 47 4e 49 4e 47 20 28 30 78 25 30 38 6c 78  SIGNING (0x%08lx
11300 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
11310 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
11320 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
11330 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
11340 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
11350 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
11360 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
11370 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
11380 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
11390 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
113a0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
113b0 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
113c0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
113d0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
113e0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
113f0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
11400 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54  TRUST_EMAIL_PROT
11410 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43 4b  ECTION:.....CACK
11420 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11430 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
11440 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
11450 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e  EMAIL_PROTECTION
11460 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
11470 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11480 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
11490 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
114a0 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c  &ck_true;.....ul
114b0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
114c0 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09  f(ck_true);.....
114d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
114e0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
114f0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
11500 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
11510 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
11520 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
11530 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
11540 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
11550 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
11560 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61  default:.....pVa
11570 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
11580 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
11590 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62  _LONG) -1;.....b
115a0 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
115b0 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61  (((CK_LONG) ulVa
115c0 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f  lueLen) != ((CK_
115d0 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09  LONG) -1)) {....
115e0 2f 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74  /* Push curr_att
115f0 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
11600 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72   */....curr_attr
11610 2e 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74  .type = curr_att
11620 72 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f  r_type;....curr_
11630 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  attr.ulValueLen 
11640 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  = ulValueLen;...
11650 09 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c  ..curr_attr.pVal
11660 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  ue = malloc(curr
11670 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
11680 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  );....memcpy(cur
11690 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70  r_attr.pValue, p
116a0 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72  Value, curr_attr
116b0 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  .ulValueLen);...
116c0 09 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65  ..if (pValue_fre
116d0 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
116e0 09 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b  ...free(pValue);
116f0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75  ....}.....if (nu
11700 6d 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c  mattrs >= retval
11710 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65  _count) {.....re
11720 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 3d 20 32 3b  tval_count *= 2;
11730 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65  .....retval = re
11740 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65  alloc(retval, re
11750 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
11760 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09  eof(*retval));..
11770 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26  ..}.....memcpy(&
11780 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d  retval[numattrs]
11790 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69  , &curr_attr, si
117a0 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29  zeof(curr_attr))
117b0 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b  ;....numattrs++;
117c0 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75  ...}..}...if (nu
117d0 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09  mattrs != 0) {..
117e0 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20  .retval_count = 
117f0 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76  numattrs;...retv
11800 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74  al = realloc(ret
11810 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  val, retval_coun
11820 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
11830 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  al));..} else {.
11840 09 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a  ..free(retval);.
11850 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c  ...retval = NULL
11860 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  ;..}...*pulCount
11870 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43   = numattrs;...C
11880 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11890 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c  TF("Returning %l
118a0 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22  u objects (%p)."
118b0 2c 20 6e 75 6d 61 74 74 72 73 2c 20 72 65 74 76  , numattrs, retv
118c0 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
118d0 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
118e0 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
118f0 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72  e_identities(str
11900 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
11910 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c  ity *identities,
11920 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69   unsigned long i
11930 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
11940 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45   {..CK_ATTRIBUTE
11950 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e   *curr_attr;..un
11960 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69  signed long id_i
11970 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09  dx, attr_idx;...
11980 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d  if (identities =
11990 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69  = NULL || identi
119a0 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29  ties_count == 0)
119b0 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a   {...return;..}.
119c0 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20  ..for (id_idx = 
119d0 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e  0; id_idx < iden
119e0 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64  tities_count; id
119f0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28  _idx++) {...if (
11a00 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
11a10 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b  x].attributes) {
11a20 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64  ....for (attr_id
11a30 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20  x = 0; attr_idx 
11a40 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  < identities[id_
11a50 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
11a60 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b  count; attr_idx+
11a70 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74  +) {.....curr_at
11a80 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73  tr = &identities
11a90 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
11aa0 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  tes[attr_idx];..
11ab0 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
11ac0 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  r->pValue) {....
11ad0 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74 72  ..free(curr_attr
11ae0 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d  ->pValue);.....}
11af0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69 64  ....}.....if (id
11b00 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
11b10 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09  .attributes) {..
11b20 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 74 69  ...free(identiti
11b30 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
11b40 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09  butes);....}....
11b50 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
11b60 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ts(identities[id
11b70 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
11b80 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a  ity, 1, 1);...}.
11b90 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74 69  .}...free(identi
11ba0 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ties);.}..static
11bb0 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69   struct cackey_i
11bc0 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  dentity *cackey_
11bd0 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
11be0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
11bf0 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
11c00 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75  ed long *ids_fou
11c10 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nd) {..struct ca
11c20 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
11c30 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
11c40 69 65 73 3b 0a 09 73 74 72 75 63 74 20 63 61 63  ies;..struct cac
11c50 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
11c60 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
11c70 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73  ned long num_ids
11c80 2c 20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 69  , id_idx, curr_i
11c90 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65  d_type;..unsigne
11ca0 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
11cb0 2c 20 63 65 72 74 5f 69 64 78 3b 0a 0a 09 43 41  , cert_idx;...CA
11cc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11cd0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
11ce0 69 66 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d  if (ids_found ==
11cf0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
11d00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11d10 45 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e  Error.  ids_foun
11d20 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  d is NULL");....
11d30 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
11d40 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ...pcsc_identiti
11d50 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
11d60 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c  _certs(slot, NUL
11d70 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
11d80 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69  .if (pcsc_identi
11d90 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
11da0 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d  ../* Convert num
11db0 62 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20  ber of Certs to 
11dc0 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  number of object
11dd0 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d  s */...num_ids =
11de0 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45   (CKO_PRIVATE_KE
11df0 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  Y - CKO_CERTIFIC
11e00 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63  ATE + 1) * num_c
11e10 65 72 74 73 3b 0a 0a 09 09 69 64 65 6e 74 69 74  erts;....identit
11e20 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d  ies = malloc(num
11e30 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69  _ids * sizeof(*i
11e40 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09  dentities));....
11e50 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f  id_idx = 0;...fo
11e60 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b  r (cert_idx = 0;
11e70 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f   cert_idx < num_
11e80 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b  certs; cert_idx+
11e90 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72  +) {....for (cur
11ea0 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f  r_id_type = CKO_
11eb0 43 45 52 54 49 46 49 43 41 54 45 3b 20 63 75 72  CERTIFICATE; cur
11ec0 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f  r_id_type <= CKO
11ed0 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75  _PRIVATE_KEY; cu
11ee0 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a  rr_id_type++) {.
11ef0 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
11f00 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
11f10 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  s = cackey_get_a
11f20 74 74 72 69 62 75 74 65 73 28 63 75 72 72 5f 69  ttributes(curr_i
11f30 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64  d_type, &pcsc_id
11f40 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
11f50 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  x], cert_idx, &i
11f60 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
11f70 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
11f80 6e 74 29 3b 0a 0a 09 09 09 09 69 66 20 28 69 64  nt);......if (id
11f90 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
11fa0 2e 61 74 74 72 69 62 75 74 65 73 20 3d 3d 20 4e  .attributes == N
11fb0 55 4c 4c 29 20 7b 0a 09 09 09 09 09 69 64 65 6e  ULL) {......iden
11fc0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
11fd0 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 20  ttributes_count 
11fe0 3d 20 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  = 0;.....}......
11ff0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
12000 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
12010 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
12020 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  (*identities[id_
12030 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
12040 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79  ty));.....memcpy
12050 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
12060 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
12070 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74  y, &pcsc_identit
12080 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73  ies[cert_idx], s
12090 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
120a0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
120b0 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09  dentity));......
120c0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
120d0 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
120e0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ->certificate = 
120f0 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e  malloc(pcsc_iden
12100 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d  tities[cert_idx]
12110 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
12120 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64  );.....memcpy(id
12130 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
12140 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  .pcsc_identity->
12150 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73  certificate, pcs
12160 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
12170 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t_idx].certifica
12180 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74  te, pcsc_identit
12190 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
121a0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
121b0 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09  .....id_idx++;..
121c0 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  ..}...}....cacke
121d0 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73  y_free_certs(pcs
121e0 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  c_identities, nu
121f0 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09  m_certs, 1);....
12200 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d  *ids_found = num
12210 5f 69 64 73 3b 0a 09 09 72 65 74 75 72 6e 28 69  _ids;...return(i
12220 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a  dentities);..}..
12230 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b  .*ids_found = 0;
12240 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
12250 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
12260 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
12270 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f  nitialize)(CK_VO
12280 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73  ID_PTR pInitArgs
12290 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41  ) {..CK_C_INITIA
122a0 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52  LIZE_ARGS CK_PTR
122b0 20 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74   args;..uint32_t
122c0 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
122d0 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 43 41 43  _init_ret;...CAC
122e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
122f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
12300 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20  f (pInitArgs != 
12310 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d  NULL) {...args =
12320 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65   pInitArgs;...me
12330 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67  mcpy(&cackey_arg
12340 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28  s, args, sizeof(
12350 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a  cackey_args));..
12360 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61  ..if (args->Crea
12370 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  teMutex == NULL 
12380 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79  || args->Destroy
12390 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
123a0 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78   args->LockMutex
123b0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
123c0 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d  ->UnlockMutex ==
123d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
123e0 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65  args->CreateMute
123f0 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
12400 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20  s->DestroyMutex 
12410 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
12420 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55  >LockMutex != NU
12430 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f  LL || args->Unlo
12440 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29  ckMutex != NULL)
12450 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
12460 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12470 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74  r. Some, but not
12480 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70   All threading p
12490 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64  rimitives provid
124a0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
124b0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
124c0 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  _BAD);....}...}.
124d0 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 70 52 65  ...if (args->pRe
124e0 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20  served != NULL) 
124f0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
12500 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12510 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f   pReserved is no
12520 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 09 72  t NULL.");.....r
12530 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
12540 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 09 7d  NTS_BAD);...}..}
12550 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79   else {...cackey
12560 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
12570 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
12580 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d  ey_args.DestroyM
12590 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
125a0 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
125b0 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
125c0 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
125d0 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  kMutex = NULL;..
125e0 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  .cackey_args.fla
125f0 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  gs = 0;..}...if 
12600 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  (cackey_initiali
12610 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
12620 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
12630 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e  ror.  Already in
12640 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
12650 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
12660 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49  TOKI_ALREADY_INI
12670 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
12680 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
12690 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
126a0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
126b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
126c0 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
126d0 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65  +) {...cackey_se
126e0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
126f0 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72  ve = 0;..}...for
12700 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
12710 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
12720 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
12730 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
12740 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61  ); idx++) {...ca
12750 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
12760 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61  active = 0;...ca
12770 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
12780 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55  pcsc_reader = NU
12790 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  LL;...cackey_slo
127a0 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74  ts[idx].transact
127b0 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09  ion_depth = 0;..
127c0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
127d0 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  x].slot_reset = 
127e0 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
127f0 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  s[idx].token_fla
12800 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63  gs = 0;..}...cac
12810 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
12820 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  = 1;...if (!cack
12830 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29  ey_biglock_init)
12840 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f   {...mutex_init_
12850 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  ret = cackey_mut
12860 65 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65  ex_create(&cacke
12870 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69  y_biglock);....i
12880 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  f (mutex_init_re
12890 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t != 0) {....CAC
128a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
128b0 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20  ("Error.  Mutex 
128c0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  initialization f
128d0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
128e0 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f  turn(CKR_CANT_LO
128f0 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  CK);...}....cack
12900 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20  ey_biglock_init 
12910 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  = 1;..}...CACKEY
12920 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
12930 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
12940 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
12950 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
12960 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
12970 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
12980 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f  _Finalize)(CK_VO
12990 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64  ID_PTR pReserved
129a0 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
129b0 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
129c0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
129d0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65  .");...if (pRese
129e0 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rved != NULL) {.
129f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12a00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52  RINTF("Error. pR
12a10 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e  eserved is not N
12a20 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
12a30 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
12a40 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
12a50 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
12a60 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
12a70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
12a80 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
12a90 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
12aa0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
12ab0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
12ac0 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
12ad0 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
12ae0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
12af0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
12b00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
12b10 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
12b20 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
12b30 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
12b40 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69  ....C_CloseSessi
12b50 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a  on(idx);...}..}.
12b60 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
12b70 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
12b80 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
12b90 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
12ba0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
12bb0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
12bc0 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ts[0])); idx++) 
12bd0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
12be0 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
12bf0 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65  eader) {....free
12c00 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
12c10 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  x].pcsc_reader);
12c20 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
12c30 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
12c40 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69  ();...cackey_ini
12c50 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09  tialized = 0;...
12c60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12c70 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
12c80 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
12c90 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
12ca0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
12cb0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
12cc0 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28  _RV, C_GetInfo)(
12cd0 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  CK_INFO_PTR pInf
12ce0 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
12cf0 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63  UTF8CHAR manufac
12d00 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53  turerID[] = "U.S
12d10 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09  . Government";..
12d20 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
12d30 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  AR libraryDescri
12d40 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
12d50 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  y";...CACKEY_DEB
12d60 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
12d70 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
12d80 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
12d90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12da0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
12db0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
12dc0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
12dd0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
12de0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
12df0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
12e00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12e10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
12e20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
12e30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
12e40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
12e50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  IZED);..}...pInf
12e60 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
12e70 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
12e80 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
12e90 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
12ea0 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
12eb0 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
12ec0 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
12ed0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
12ee0 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
12ef0 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74  & 0xff;...memset
12f00 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
12f10 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
12f20 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
12f30 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65  acturerID));..me
12f40 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
12f50 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75  facturerID, manu
12f60 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65  facturerID, size
12f70 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49  of(manufacturerI
12f80 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f  D) - 1);...pInfo
12f90 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a  ->flags = 0x00;.
12fa0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
12fb0 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
12fc0 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
12fd0 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
12fe0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
12ff0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mcpy(pInfo->libr
13000 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
13010 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
13020 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61  on, sizeof(libra
13030 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d  ryDescription) -
13040 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69   1);...pInfo->li
13050 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a  braryVersion.maj
13060 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
13070 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
13080 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
13090 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
130a0 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
130b0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
130c0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43  8) & 0xff;...CAC
130d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
130e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
130f0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
13100 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
13110 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72  OK);.}../*. * Pr
13120 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65  ocess list of re
13130 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74  aders, and creat
13140 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65  e mapping betwee
13150 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e  n reader name an
13160 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b  d slot ID. */.CK
13170 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
13180 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
13190 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20  tList)(CK_BBOOL 
131a0 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b  tokenPresent, CK
131b0 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
131c0 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  otList, CK_ULONG
131d0 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
131e0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
131f0 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f  al;..int pcsc_co
13200 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55  nnect_ret;..CK_U
13210 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74  LONG count, slot
13220 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72  _count = 0, curr
13230 73 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73  slot;..char *pcs
13240 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63  c_readers, *pcsc
13250 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73  _readers_s, *pcs
13260 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57  c_readers_e;..DW
13270 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73  ORD pcsc_readers
13280 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _len;..LONG scar
13290 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
132a0 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f  t;..size_t curr_
132b0 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41  reader_len;...CA
132c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
132d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
132e0 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20  if (pulCount == 
132f0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
13300 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13310 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69  rror. pulCount i
13320 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
13330 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
13340 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
13350 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
13360 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
13370 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13380 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
13390 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
133a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
133b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
133c0 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ED);..}...mutex_
133d0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
133e0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
133f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
13400 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
13410 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
13420 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
13430 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
13440 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
13450 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
13460 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c  ROR);..}.../* Cl
13470 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  ear list of slot
13480 73 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c  s */..if (pSlotL
13490 69 73 74 29 20 7b 0a 09 09 2f 2a 20 4f 6e 6c 79  ist) {.../* Only
134a0 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74   update the list
134b0 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20   of slots if we 
134c0 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69  are actually bei
134d0 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c  ng supply the sl
134e0 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ot information *
134f0 2f 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  /...cackey_slots
13500 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
13510 29 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 73  );....for (currs
13520 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
13530 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
13540 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
13550 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
13560 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
13570 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
13580 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
13590 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b  ].pcsc_reader) {
135a0 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
135b0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
135c0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a  .pcsc_reader);..
135d0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
135e0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
135f0 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
13600 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ..}.....cackey_s
13610 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
13620 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09  ctive = 0;...}..
13630 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
13640 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
13650 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63   */..pcsc_connec
13660 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
13670 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
13680 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
13690 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
136a0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
136b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
136c0 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
136d0 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61   PC/SC failed, a
136e0 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73  ssuming no slots
136f0 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e  ");....slot_coun
13700 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  t = 0;..} else {
13710 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
13720 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72  len = 0;....scar
13730 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
13740 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
13750 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
13760 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
13770 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64  NULL, &pcsc_read
13780 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28  ers_len);...if (
13790 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
137a0 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
137b0 5f 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63  _SUCCESS && pcsc
137c0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20  _readers_len != 
137d0 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61  0) {....pcsc_rea
137e0 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  ders = malloc(pc
137f0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
13800 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
13810 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _s = pcsc_reader
13820 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73  s;.....scard_lis
13830 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53  treaders_ret = S
13840 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
13850 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
13860 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f  dle, NULL, pcsc_
13870 72 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72  readers, &pcsc_r
13880 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
13890 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
138a0 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
138b0 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
138c0 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
138d0 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _e = pcsc_reader
138e0 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73  s + pcsc_readers
138f0 5f 6c 65 6e 3b 0a 0a 09 09 09 09 63 75 72 72 73  _len;......currs
13900 6c 6f 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69  lot = 0;.....whi
13910 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73  le (pcsc_readers
13920 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   < pcsc_readers_
13930 65 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 72  e) {......curr_r
13940 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c  eader_len = strl
13950 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29  en(pcsc_readers)
13960 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73  ;.......if ((pcs
13970 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72  c_readers + curr
13980 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70  _reader_len) > p
13990 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
139a0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
139b0 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63  ...}.......if (c
139c0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
139d0 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65  = 0) {.......bre
139e0 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
139f0 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d  .if (currslot >=
13a00 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
13a10 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
13a20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
13a30 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  )) {.......CACKE
13a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13a50 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65  Found more reade
13a60 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72  rs than slots ar
13a70 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a  e available!");.
13a80 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
13a90 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45  ...}.......CACKE
13aa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13ab0 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73  Found reader: %s
13ac0 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29  ", pcsc_readers)
13ad0 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20  ;......./* Only 
13ae0 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
13af0 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
13b00 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
13b10 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  g supply the slo
13b20 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
13b30 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c  ......if (pSlotL
13b40 69 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61 63  ist) {.......cac
13b50 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
13b60 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a  ot].active = 1;.
13b70 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
13b80 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
13b90 63 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75  c_reader = strdu
13ba0 70 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  p(pcsc_readers);
13bb0 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
13bc0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
13bd0 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
13be0 64 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63  d = 0;.......cac
13bf0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
13c00 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot].transaction_
13c10 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09  depth = 0;......
13c20 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
13c30 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73  rrslot].slot_res
13c40 65 74 20 3d 20 31 3b 0a 09 09 09 09 09 09 63 61  et = 1;.......ca
13c50 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
13c60 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot].token_flags
13c70 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
13c80 55 49 52 45 44 3b 0a 09 09 09 09 09 7d 0a 09 09  UIRED;......}...
13c90 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
13ca0 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
13cb0 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
13cc0 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
13cd0 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
13ce0 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  t > 0) {......sl
13cf0 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72 73  ot_count = currs
13d00 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  lot;.....}....} 
13d10 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
13d20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13d30 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53  Second call to S
13d40 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20  CardListReaders 
13d50 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25  failed, return %
13d60 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44  s/%li", CACKEY_D
13d70 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
13d80 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
13d90 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
13da0 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c  , (long) scard_l
13db0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b  istreaders_ret);
13dc0 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70  ....}.....free(p
13dd0 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a  csc_readers_s);.
13de0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
13df0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13e00 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f  F("First call to
13e10 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
13e20 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
13e30 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
13e40 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
13e50 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
13e60 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
13e70 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
13e80 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
13e90 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
13ea0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
13eb0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
13ec0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
13ed0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
13ee0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
13ef0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13f00 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
13f10 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
13f20 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
13f30 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
13f40 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  .if (pSlotList =
13f50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
13f60 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
13f70 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  nt;....CACKEY_DE
13f80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
13f90 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
13fa0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
13fb0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
13fc0 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75  .}...count = *pu
13fd0 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75  lCount;..if (cou
13fe0 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  nt < slot_count)
13ff0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14000 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14010 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20   User allocated 
14020 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74  %lu entries, but
14030 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74   we have %lu ent
14040 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73  ries.", count, s
14050 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  lot_count);....r
14060 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
14070 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
14080 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
14090 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
140a0 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 72   slot_count; cur
140b0 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 53 6c  rslot++) {...pSl
140c0 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d  otList[currslot]
140d0 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 7d 0a   = currslot;..}.
140e0 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
140f0 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
14100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14110 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
14120 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
14130 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b  lu readers.", CK
14140 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
14150 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
14160 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
14170 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73  OK);...tokenPres
14180 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65  ent = tokenPrese
14190 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  nt; /* Supress u
141a0 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
141b0 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
141c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
141d0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
141e0 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
141f0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54   slotID, CK_SLOT
14200 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
14210 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
14220 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72  F8CHAR slotDescr
14230 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
14240 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d  ey Slot";..int m
14250 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
14260 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  t bytes_to_copy;
14270 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14280 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
14290 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
142a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
142b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
142c0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
142d0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
142e0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
142f0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
14300 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
14310 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
14320 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
14330 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
14340 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
14350 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
14360 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
14370 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
14380 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
14390 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
143a0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
143b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
143c0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
143d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
143e0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
143f0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
14400 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
14410 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
14420 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
14430 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
14440 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
14450 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
14460 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
14470 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
14480 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
14490 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
144a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
144b0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
144c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
144d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
144e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
144f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
14500 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
14510 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
14520 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
14530 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
14540 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
14550 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
14560 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
14570 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
14580 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
14590 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
145a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
145b0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
145c0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
145d0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
145e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
145f0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
14600 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
14610 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14620 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
14630 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
14640 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
14650 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
14660 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
14670 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
14680 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
14690 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  of(pInfo->slotDe
146a0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
146b0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mcpy(pInfo->slot
146c0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f  Description, slo
146d0 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  tDescription, si
146e0 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70  zeof(slotDescrip
146f0 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  tion) - 1);...me
14700 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
14710 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
14720 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
14730 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
14740 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
14750 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79   = strlen(cackey
14760 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70  _slots[slotID].p
14770 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66  csc_reader);..if
14780 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e   (sizeof(pInfo->
14790 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
147a0 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  < bytes_to_copy)
147b0 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f   {...bytes_to_co
147c0 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66  py = sizeof(pInf
147d0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
147e0 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70  D);..}..memcpy(p
147f0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
14800 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f  erID, cackey_slo
14810 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
14820 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f  reader, bytes_to
14830 5f 63 6f 70 79 29 3b 0a 0a 09 70 49 6e 66 6f 2d  _copy);...pInfo-
14840 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52 45 4d  >flags = CKF_REM
14850 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 20 7c 20  OVABLE_DEVICE | 
14860 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69  CKF_HW_SLOT;...i
14870 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
14880 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
14890 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d  slots[slotID]) =
148a0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
148b0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
148c0 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c  ..pInfo->flags |
148d0 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53  = CKF_TOKEN_PRES
148e0 45 4e 54 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ENT;..}...pInfo-
148f0 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
14900 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79  .major = (cackey
14910 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
14920 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49   16) & 0xff;..pI
14930 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72  nfo->hardwareVer
14940 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61  sion.minor = (ca
14950 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
14960 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
14970 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
14980 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
14990 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66   0x00;..pInfo->f
149a0 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
149b0 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43  inor = 0x00;...C
149c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
149d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
149e0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
149f0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
14a00 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
14a10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
14a20 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  RV, C_GetTokenIn
14a30 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
14a40 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f  lotID, CK_TOKEN_
14a50 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
14a60 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
14a70 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72  8CHAR manufactur
14a80 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47  erID[] = "U.S. G
14a90 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61  overnment";..sta
14aa0 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
14ab0 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d  defaultLabel[] =
14ac0 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22   "Unknown Token"
14ad0 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
14ae0 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20  8CHAR model[] = 
14af0 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74  "CAC Token";..st
14b00 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
14b10 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
14b20 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
14b30 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
14b40 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c  erts;..ssize_t l
14b50 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  abel_ret;..int m
14b60 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
14b70 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  t use_default_la
14b80 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  bel;...CACKEY_DE
14b90 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
14ba0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
14bb0 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
14bc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14bd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
14be0 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
14bf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
14c00 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
14c10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
14c20 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
14c30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14c40 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
14c50 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
14c60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
14c70 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
14c80 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
14c90 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
14ca0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
14cb0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
14cc0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
14cd0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
14ce0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14cf0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
14d00 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
14d10 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
14d20 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
14d30 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
14d40 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
14d50 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
14d60 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
14d70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
14d80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
14d90 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
14da0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
14db0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14dc0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
14dd0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
14de0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
14df0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
14e00 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
14e10 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
14e20 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
14e30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14e40 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
14e50 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
14e60 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
14e70 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
14e80 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
14e90 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
14ea0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
14eb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
14ec0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
14ed0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
14ee0 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
14ef0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
14f00 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59  otID]) != CACKEY
14f10 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
14f20 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  SENT) {...CACKEY
14f30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e  _DEBUG_PRINTF("N
14f40 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65  o token is prese
14f50 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25  nt in slotID = %
14f60 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  lu", slotID);...
14f70 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
14f80 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
14f90 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
14fa0 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52  CKR_TOKEN_NOT_PR
14fb0 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74  ESENT);..}...mut
14fc0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
14fd0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
14fe0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
14ff0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
15000 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
15010 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15020 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
15030 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
15040 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
15050 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
15060 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  ../* Determine t
15070 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20  oken label from 
15080 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a  certificates */.
15090 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c  .memset(pInfo->l
150a0 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f  abel, ' ', sizeo
150b0 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
150c0 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  ;..use_default_l
150d0 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 70 63 73 63  abel = 1;...pcsc
150e0 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
150f0 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
15100 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
15110 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75  otID], NULL, &nu
15120 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70  m_certs);..if (p
15130 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21  csc_identities !
15140 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
15150 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b  num_certs > 0) {
15160 0a 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20  ....label_ret = 
15170 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
15180 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63  tity_to_label(pc
15190 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70  sc_identities, p
151a0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
151b0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
151c0 29 29 3b 0a 09 09 09 69 66 20 28 6c 61 62 65 6c  ));....if (label
151d0 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09  _ret > 0) {.....
151e0 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
151f0 6c 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 0a  l = 0;....}...}.
15200 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
15210 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
15220 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
15230 20 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73   1);..}...if (us
15240 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29  e_default_label)
15250 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66   {...memcpy(pInf
15260 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c  o->label, defaul
15270 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64  tLabel, sizeof(d
15280 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31  efaultLabel) - 1
15290 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
152a0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
152b0 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
152c0 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
152d0 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63  turerID));..memc
152e0 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
152f0 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61  cturerID, manufa
15300 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66  cturerID, sizeof
15310 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  (manufacturerID)
15320 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
15330 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20  pInfo->model, ' 
15340 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
15350 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70  >model));..memcp
15360 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20  y(pInfo->model, 
15370 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f  model, sizeof(mo
15380 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  del) - 1);...mem
15390 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  set(pInfo->seria
153a0 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69  lNumber, ' ', si
153b0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69  zeof(pInfo->seri
153c0 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65  alNumber));...me
153d0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54  mset(pInfo->utcT
153e0 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ime, ' ', sizeof
153f0 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29  (pInfo->utcTime)
15400 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  );...pInfo->hard
15410 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
15420 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
15430 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
15440 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
15450 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
15460 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
15470 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
15480 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e  8) & 0xff;...pIn
15490 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
154a0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30  ion.major = 0x00
154b0 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ;..pInfo->firmwa
154c0 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
154d0 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d  = 0x00;...pInfo-
154e0 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49  >flags = CKF_WRI
154f0 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43  TE_PROTECTED | C
15500 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54  KF_USER_PIN_INIT
15510 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f  IALIZED | CKF_TO
15520 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20  KEN_INITIALIZED 
15530 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  | cackey_slots[s
15540 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
15550 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  gs;...pInfo->ulM
15560 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  axSessionCount =
15570 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
15580 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
15590 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
155a0 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49  ns[0])) - 1;..pI
155b0 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f  nfo->ulSessionCo
155c0 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  unt = CK_UNAVAIL
155d0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
155e0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52  ;..pInfo->ulMaxR
155f0 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  wSessionCount = 
15600 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53  0;..pInfo->ulRwS
15610 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b  essionCount = CK
15620 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
15630 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
15640 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20  ->ulMaxPinLen = 
15650 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  128;..pInfo->ulM
15660 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70  inPinLen = 0;..p
15670 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62  Info->ulTotalPub
15680 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  licMemory = CK_U
15690 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
156a0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
156b0 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f  ulFreePublicMemo
156c0 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
156d0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
156e0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c  ..pInfo->ulTotal
156f0 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
15700 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
15710 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
15720 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74  fo->ulFreePrivat
15730 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  eMemory = CK_UNA
15740 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
15750 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  TION;...CACKEY_D
15760 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
15770 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
15780 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
15790 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
157a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
157b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
157c0 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29  aitForSlotEvent)
157d0 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c  (CK_FLAGS flags,
157e0 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20   CK_SLOT_ID_PTR 
157f0 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44  pSlotID, CK_VOID
15800 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
15810 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
15820 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
15830 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
15840 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
15850 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15860 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
15870 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
15880 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
15890 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
158a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
158b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
158c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
158d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
158e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
158f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
15900 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
15910 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
15920 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
15930 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15940 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
15950 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
15960 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
15970 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
15980 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
15990 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
159a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
159b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
159c0 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61  K_RV, C_GetMecha
159d0 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f  nismList)(CK_SLO
159e0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
159f0 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50  MECHANISM_TYPE_P
15a00 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  TR pMechanismLis
15a10 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
15a20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43  pulCount) {..CAC
15a30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15a40 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
15a50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
15a60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
15a70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15a80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
15a90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
15aa0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
15ab0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
15ac0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
15ad0 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ulCount == NULL)
15ae0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15af0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
15b00 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55    pulCount is NU
15b10 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
15b20 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
15b30 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
15b40 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20  echanismList == 
15b50 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f  NULL) {...*pulCo
15b60 75 6e 74 20 3d 20 33 3b 0a 0a 09 09 43 41 43 4b  unt = 3;....CACK
15b70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15b80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
15b90 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
15ba0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
15bb0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70  OK);..}...if (*p
15bc0 75 6c 43 6f 75 6e 74 20 3c 20 33 29 20 7b 0a 09  ulCount < 3) {..
15bd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15be0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75  INTF("Error.  Bu
15bf0 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22  ffer too small."
15c00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15c10 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
15c20 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e  L);..}...pMechan
15c30 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d  ismList[0] = CKM
15c40 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 70 4d 65 63  _RSA_PKCS;..pMec
15c50 68 61 6e 69 73 6d 4c 69 73 74 5b 31 5d 20 3d 20  hanismList[1] = 
15c60 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43  CKM_SHA1_RSA_PKC
15c70 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  S;..*pulCount = 
15c80 32 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  2;...CACKEY_DEBU
15c90 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15ca0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
15cb0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
15cc0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
15cd0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
15ce0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d  ON(CK_RV, C_GetM
15cf0 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b  echanismInfo)(CK
15d00 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
15d10 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59   CK_MECHANISM_TY
15d20 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48  PE type, CK_MECH
15d30 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70  ANISM_INFO_PTR p
15d40 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
15d50 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
15d60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15d70 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
15d80 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
15d90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15da0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15db0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
15dc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
15dd0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
15de0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
15df0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
15e00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15e10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
15e20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
15e30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
15e40 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
15e50 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
15e60 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
15e70 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
15e80 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
15e90 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
15ea0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
15eb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15ec0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
15ed0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
15ee0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
15ef0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
15f00 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
15f10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
15f20 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
15f30 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
15f40 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
15f50 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
15f60 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
15f70 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
15f80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15f90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
15fa0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
15fb0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
15fc0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
15fd0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
15fe0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
15ff0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
16000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16010 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
16020 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
16030 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
16040 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
16050 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
16060 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
16070 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
16080 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
16090 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
160a0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
160b0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
160c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
160d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
160e0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
160f0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
16100 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16110 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
16120 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
16130 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
16140 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
16150 0a 09 2f 2a 20 58 58 58 3a 20 54 68 69 73 20 69  ../* XXX: This i
16160 73 20 75 6e 74 65 73 74 65 64 2c 20 61 6e 64 20  s untested, and 
16170 66 75 72 74 68 65 72 20 49 27 6d 20 6e 6f 74 20  further I'm not 
16180 72 65 61 6c 6c 79 20 73 75 72 65 20 69 66 20 74  really sure if t
16190 68 69 73 20 69 73 20 63 6f 72 72 65 63 74 2e 20  his is correct. 
161a0 2a 2f 0a 09 73 77 69 74 63 68 20 28 74 79 70 65  */..switch (type
161b0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
161c0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66  SA_PKCS:....pInf
161d0 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20  o->ulMinKeySize 
161e0 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d  = 512;....pInfo-
161f0 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20  >ulMaxKeySize = 
16200 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e  8192;....pInfo->
16210 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c  flags = CKF_HW |
16220 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43   CKF_ENCRYPT | C
16230 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46  KF_DECRYPT | CKF
16240 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49  _SIGN | CKF_VERI
16250 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  FY;....break;...
16260 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 58 5f 35  case CKM_RSA_X_5
16270 30 39 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  09:....pInfo->ul
16280 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32  MinKeySize = 512
16290 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ;....pInfo->ulMa
162a0 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b  xKeySize = 8192;
162b0 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ....pInfo->flags
162c0 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f   = CKF_HW | CKF_
162d0 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45  ENCRYPT | CKF_DE
162e0 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e  CRYPT | CKF_SIGN
162f0 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09   | CKF_VERIFY;..
16300 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
16310 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43  CKM_SHA1_RSA_PKC
16320 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  S:....pInfo->ulM
16330 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b  inKeySize = 512;
16340 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ....pInfo->ulMax
16350 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a  KeySize = 8192;.
16360 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
16370 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 53  = CKF_HW | CKF_S
16380 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59  IGN | CKF_VERIFY
16390 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
163a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
163b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
163c0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
163d0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
163e0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57  CKR_OK);.}../* W
163f0 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
16400 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
16410 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
16420 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74  ON(CK_RV, C_Init
16430 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49  Token)(CK_SLOT_I
16440 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46  D slotID, CK_UTF
16450 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
16460 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
16470 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
16480 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41  TR pLabel) {..CA
16490 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
164a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
164b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
164c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
164d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
164e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
164f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
16500 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
16510 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
16520 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
16530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16540 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54  "Returning CKR_T
16550 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
16560 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  CTED (%i)", CKR_
16570 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
16580 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ECTED);...return
16590 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45  (CKR_TOKEN_WRITE
165a0 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a  _PROTECTED);.}..
165b0 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
165c0 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
165d0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
165e0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
165f0 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53  InitPIN)(CK_SESS
16600 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
16610 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ion, CK_UTF8CHAR
16620 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
16630 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a  ONG ulPinLen) {.
16640 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16650 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
16660 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
16670 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
16680 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16690 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
166a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
166b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
166c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
166d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
166e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
166f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
16700 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
16710 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
16720 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
16730 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
16740 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
16750 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
16760 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
16770 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
16780 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
16790 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
167a0 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45   C_SetPIN)(CK_SE
167b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
167c0 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
167d0 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20  AR_PTR pOldPin, 
167e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69  CK_ULONG ulOldPi
167f0 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
16800 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43  R_PTR pNewPin, C
16810 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e  K_ULONG ulNewPin
16820 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
16830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
16840 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
16850 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
16860 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
16870 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16880 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
16890 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
168a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
168b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
168c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
168d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
168e0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
168f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
16900 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
16910 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
16920 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
16930 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
16940 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
16950 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
16960 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73  CK_RV, C_OpenSes
16970 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  sion)(CK_SLOT_ID
16980 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47   slotID, CK_FLAG
16990 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44  S flags, CK_VOID
169a0 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
169b0 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74  n, CK_NOTIFY not
169c0 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f  ify, CK_SESSION_
169d0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73  HANDLE_PTR phSes
169e0 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  sion) {..unsigne
169f0 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74  d long idx;..int
16a00 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
16a10 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f  int found_sessio
16a20 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f  n = 0;...CACKEY_
16a30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
16a40 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
16a50 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49  flags & CKF_SERI
16a60 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43  AL_SESSION) != C
16a70 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
16a80 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b  N) {...return(CK
16a90 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c  R_SESSION_PARALL
16aa0 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  EL_NOT_SUPPORTED
16ab0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
16ac0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
16ad0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16ae0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16af0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
16b00 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
16b10 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
16b20 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
16b30 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
16b40 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
16b50 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
16b60 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
16b70 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
16b80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
16b90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
16ba0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
16bb0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
16bc0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
16bd0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
16be0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
16bf0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
16c00 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
16c10 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
16c20 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
16c30 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
16c40 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
16c50 20 7b 0a 09 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 45 72 72 6f 72 2e  G_PRINTF("Error.
16c70 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
16c80 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
16c90 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
16ca0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
16cb0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
16cc0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
16cd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16ce0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
16cf0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
16d00 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
16d10 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
16d20 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
16d30 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
16d40 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
16d50 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
16d60 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
16d70 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a  NVALID);..}.../*
16d80 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
16d90 20 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c   card is actuall
16da0 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a  y in the slot. *
16db0 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b  /../* XXX: Check
16dc0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
16dd0 69 73 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43  is is in the PKC
16de0 53 23 31 31 20 73 70 65 63 69 66 69 63 61 74 69  S#11 specificati
16df0 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65  on */..if (cacke
16e00 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
16e10 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
16e20 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59  otID]) != CACKEY
16e30 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
16e40 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  SENT) {...CACKEY
16e50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
16e60 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20  rror.  Card not 
16e70 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e  present.  Return
16e80 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  ing CKR_DEVICE_R
16e90 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63  EMOVED");....cac
16ea0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
16eb0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
16ec0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
16ed0 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b  DEVICE_REMOVED);
16ee0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
16ef0 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   1; idx < (sizeo
16f00 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
16f10 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
16f20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
16f30 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
16f40 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
16f50 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
16f60 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f  ....found_sessio
16f70 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65  n = 1;.....*phSe
16f80 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09  ssion = idx;....
16f90 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
16fa0 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31  [idx].active = 1
16fb0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
16fc0 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44  ions[idx].slotID
16fd0 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61   = slotID;....ca
16fe0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
16ff0 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  x].state = CKS_R
17000 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e  O_PUBLIC_SESSION
17010 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
17020 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20  ions[idx].flags 
17030 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b  = flags;....cack
17040 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
17050 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d  .ulDeviceError =
17060 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   0;....cackey_se
17070 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70  ssions[idx].pApp
17080 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c  lication = pAppl
17090 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b  ication;....cack
170a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
170b0 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79  .Notify = notify
170c0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
170d0 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
170e0 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
170f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
17100 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
17110 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09  _count = 0;.....
17120 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
17130 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  idx].search_acti
17140 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
17150 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
17160 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
17170 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
17180 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79  sions[idx].decry
17190 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  pt_active = 0;..
171a0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
171b0 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
171c0 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
171d0 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
171e0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
171f0 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  ], &cackey_sessi
17200 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
17210 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09  ies_count);.....
17220 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
17230 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
17240 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
17250 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
17260 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
17270 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
17280 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17290 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
172a0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
172b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
172c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
172d0 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64  ..}...if (!found
172e0 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41  _session) {...CA
172f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17300 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
17310 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28  _SESSION_COUNT (
17320 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f  %i)", CKR_SESSIO
17330 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74  N_COUNT);....ret
17340 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
17350 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43  COUNT);..}...CAC
17360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17370 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
17380 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
17390 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
173a0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
173b0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
173c0 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  , C_CloseSession
173d0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
173e0 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
173f0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
17400 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
17410 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
17420 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
17430 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
17440 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17450 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17460 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
17470 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
17480 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
17490 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
174a0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
174b0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
174c0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
174d0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
174e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
174f0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
17500 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17510 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
17520 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
17530 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
17540 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
17550 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
17560 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
17570 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
17580 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
17590 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
175a0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
175b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
175c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
175d0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
175e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
175f0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
17600 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
17610 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
17620 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
17630 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
17640 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
17650 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
17660 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17670 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
17680 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
17690 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
176a0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
176b0 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
176c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
176d0 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  on].active = 0;.
176e0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65  .cackey_free_ide
176f0 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73  ntities(cackey_s
17700 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
17710 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61  ].identities, ca
17720 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
17730 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
17740 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74  es_count);...mut
17750 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
17760 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
17770 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
17780 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
17790 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
177a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
177b0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
177c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
177d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
177e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
177f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17800 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
17810 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
17820 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
17830 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
17840 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
17850 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c  CK_RV, C_CloseAl
17860 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c  lSessions)(CK_SL
17870 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a  OT_ID slotID) {.
17880 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09  .uint32_t idx;..
17890 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
178a0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
178b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
178c0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
178d0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
178e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
178f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
17900 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
17910 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
17920 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
17930 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
17940 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
17950 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
17960 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
17970 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
17980 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
17990 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
179a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
179b0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
179c0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
179d0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
179e0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
179f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
17a00 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
17a10 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
17a20 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
17a30 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
17a40 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
17a50 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
17a60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17a70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
17a80 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
17a90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
17aa0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
17ab0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
17ac0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
17ad0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
17ae0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17af0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
17b00 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
17b10 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
17b20 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
17b30 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
17b40 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
17b50 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
17b60 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
17b70 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
17b80 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  ALID);..}...for 
17b90 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
17ba0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
17bb0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
17bc0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
17bd0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
17be0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
17bf0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
17c00 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63  ve) {....if (cac
17c10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
17c20 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74  ].slotID != slot
17c30 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  ID) {.....contin
17c40 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ue;....}.....cac
17c50 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
17c60 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
17c70 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73  ;....C_CloseSess
17c80 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63  ion(idx);....cac
17c90 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
17ca0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
17cb0 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
17cc0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
17cd0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
17ce0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
17cf0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
17d00 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
17d10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17d20 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
17d30 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
17d40 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
17d50 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
17d60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17d70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
17d80 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
17d90 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
17da0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
17db0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
17dc0 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49  V, C_GetSessionI
17dd0 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nfo)(CK_SESSION_
17de0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
17df0 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f   CK_SESSION_INFO
17e00 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
17e10 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
17e20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17e30 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
17e40 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
17e50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
17e60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17e70 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
17e80 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
17e90 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
17ea0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
17eb0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
17ec0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
17ed0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17ee0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
17ef0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
17f00 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
17f10 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
17f20 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
17f30 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
17f40 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
17f50 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
17f60 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
17f70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
17f80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17f90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17fa0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
17fb0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
17fc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
17fd0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
17fe0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
17ff0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
18000 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
18010 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
18020 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
18030 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
18040 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18050 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
18060 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
18070 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
18080 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
18090 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
180a0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
180b0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
180c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
180d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
180e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
180f0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
18100 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
18110 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
18120 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
18130 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
18140 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20  pInfo->slotID = 
18150 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18160 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
18170 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20  ;..pInfo->state 
18180 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
18190 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
181a0 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  e;..pInfo->flags
181b0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
181c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61  ns[hSession].fla
181d0 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65  gs;..pInfo->ulDe
181e0 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b  viceError = cack
181f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
18200 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72  sion].ulDeviceEr
18210 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ror;...mutex_ret
18220 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
18230 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
18240 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
18250 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
18260 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
18270 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18280 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
18290 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
182a0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
182b0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
182c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
182d0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
182e0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
182f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
18300 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
18310 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
18320 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_GetOperationS
18330 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tate)(CK_SESSION
18340 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
18350 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f  , CK_BYTE_PTR pO
18360 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43  perationState, C
18370 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f  K_ULONG_PTR pulO
18380 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e  perationStateLen
18390 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
183a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
183b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
183c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
183d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
183e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
183f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
18400 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
18410 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
18420 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
18430 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18440 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
18450 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
18460 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
18470 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
18480 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
18490 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
184a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
184b0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
184c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
184d0 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69  RV, C_SetOperati
184e0 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53  onState)(CK_SESS
184f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
18500 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
18510 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65   pOperationState
18520 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65  , CK_ULONG ulOpe
18530 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20  rationStateLen, 
18540 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
18550 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c   hEncryptionKey,
18560 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
18570 45 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f  E hAuthenticatio
18580 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nKey) {..CACKEY_
18590 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
185a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
185b0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
185c0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
185d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
185e0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
185f0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
18600 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
18610 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
18620 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
18630 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
18640 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
18650 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
18660 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
18670 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
18680 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
18690 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
186a0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
186b0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
186c0 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29  (CK_RV, C_Login)
186d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
186e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
186f0 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79  USER_TYPE userTy
18700 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  pe, CK_UTF8CHAR_
18710 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
18720 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
18730 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
18740 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
18750 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67  aining;..int log
18760 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  in_ret;...CACKEY
18770 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
18780 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
18790 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
187a0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
187b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
187c0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
187d0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
187e0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
187f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
18800 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
18810 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
18820 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
18830 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
18840 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
18850 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
18860 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
18870 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18880 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
18890 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
188a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
188b0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
188c0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  D);..}...if (use
188d0 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45  rType != CKU_USE
188e0 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  R) {...CACKEY_DE
188f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18900 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  r.  We only supp
18910 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61  ort USER mode, a
18920 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64  sked for %lu mod
18930 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  e.", (unsigned l
18940 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a  ong) userType)..
18950 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45  ..return(CKR_USE
18960 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b  R_TYPE_INVALID);
18970 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
18980 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
18990 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
189a0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
189b0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
189c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
189d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
189e0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
189f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
18a00 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
18a10 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
18a20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
18a30 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
18a40 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
18a50 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
18a60 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
18a70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18a80 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
18a90 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
18aa0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
18ab0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
18ac0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69  ALID);..}...logi
18ad0 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c  n_ret = cackey_l
18ae0 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ogin(&cackey_slo
18af0 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ts[cackey_sessio
18b00 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
18b10 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69  tID], pPin, ulPi
18b20 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d  nLen, &tries_rem
18b30 61 69 6e 69 6e 67 29 3b 0a 09 69 66 20 28 6c 6f  aining);..if (lo
18b40 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  gin_ret != CACKE
18b50 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
18b60 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
18b70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
18b80 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 67  ock);....if (log
18b90 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59  in_ret == CACKEY
18ba0 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20  _PCSC_E_LOCKED) 
18bb0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
18bc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18bd0 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65    Token is locke
18be0 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  d.");.....cackey
18bf0 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65  _slots[cackey_se
18c00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
18c10 2e 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  .slotID].token_f
18c20 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
18c30 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09  _PIN_LOCKED;....
18c40 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
18c50 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73  LOCKED);...} els
18c60 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20  e if (login_ret 
18c70 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
18c80 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41  _BADPIN) {....CA
18c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18ca0 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c  F("Error.  Inval
18cb0 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63  id PIN.");.....c
18cc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b  ackey_slots[cack
18cd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
18ce0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2e 74 6f  sion].slotID].to
18cf0 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46  ken_flags |= CKF
18d00 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f  _USER_PIN_COUNT_
18d10 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69  LOW;.....if (tri
18d20 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20  es_remaining == 
18d30 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  1) {.....cackey_
18d40 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73  slots[cackey_ses
18d50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
18d60 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
18d70 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f  ags |= CKF_USER_
18d80 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09  PIN_FINAL_TRY;..
18d90 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ..}.....return(C
18da0 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
18db0 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
18dc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18dd0 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65  rror.  Unknown e
18de0 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72  rror returned fr
18df0 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  om cackey_login(
18e00 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72  ) (%i)", login_r
18e10 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  et);....return(C
18e20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
18e30 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
18e40 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73  lots[cackey_sess
18e50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
18e60 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
18e70 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52  gs &= ~(CKF_USER
18e80 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b  _PIN_LOCKED | CK
18e90 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54  F_USER_PIN_COUNT
18ea0 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e  _LOW | CKF_LOGIN
18eb0 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f  _REQUIRED | CKF_
18ec0 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
18ed0 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  RY);...cackey_se
18ee0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
18ef0 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
18f00 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a  USER_FUNCTIONS;.
18f10 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
18f20 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
18f30 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
18f40 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
18f50 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
18f60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18f70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
18f80 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
18f90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
18fa0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
18fb0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
18fc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
18fd0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
18fe0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
18ff0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
19000 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
19010 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
19020 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gout)(CK_SESSION
19030 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
19040 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
19050 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
19060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
19070 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
19080 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
19090 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
190a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
190b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
190c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
190d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
190e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
190f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
19100 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
19110 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
19120 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
19130 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
19140 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
19150 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19160 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19170 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
19180 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
19190 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
191a0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
191b0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
191c0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
191d0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
191e0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
191f0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
19200 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19210 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19220 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
19230 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
19240 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
19250 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
19260 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
19270 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
19280 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
19290 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
192a0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
192b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
192c0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
192d0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
192e0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
192f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
19300 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
19310 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
19320 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20  ession].state = 
19330 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
19340 53 53 49 4f 4e 3b 0a 0a 09 6d 75 74 65 78 5f 72  SSION;...mutex_r
19350 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
19360 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
19370 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
19380 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
19390 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
193a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
193b0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
193c0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
193d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
193e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
193f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19400 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
19410 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
19420 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
19430 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
19440 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
19450 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  V, C_CreateObjec
19460 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
19470 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
19480 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
19490 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
194a0 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
194b0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
194c0 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43  R phObject) {..C
194d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
194e0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
194f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
19500 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
19510 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19520 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
19530 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
19540 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
19550 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
19560 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
19570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19580 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
19590 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
195a0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
195b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
195c0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
195d0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
195e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
195f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
19600 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
19610 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53  CopyObject)(CK_S
19620 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
19630 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
19640 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
19650 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
19660 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
19670 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
19680 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
19690 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74  _PTR phNewObject
196a0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
196b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
196c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
196d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
196e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
196f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19700 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
19710 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
19720 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
19730 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
19740 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19750 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
19760 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
19770 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
19780 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
19790 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
197a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
197b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
197c0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
197d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
197e0 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a  RV, C_DestroyObj
197f0 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
19800 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
19810 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
19820 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41  E hObject) {..CA
19830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19840 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
19850 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
19860 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
19870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19880 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
19890 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
198a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
198b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
198c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
198d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
198e0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
198f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
19900 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
19910 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
19920 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
19930 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
19940 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
19950 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
19960 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
19970 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b  etObjectSize)(CK
19980 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
19990 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
199a0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
199b0 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ct, CK_ULONG_PTR
199c0 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43   pulSize) {..CAC
199d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
199e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
199f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
19a00 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
19a10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19a20 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
19a30 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
19a40 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
19a50 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
19a60 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
19a70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19a80 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
19a90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
19aa0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
19ab0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
19ac0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
19ad0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
19ae0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
19af0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
19b00 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
19b10 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29  tAttributeValue)
19b20 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
19b30 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
19b40 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
19b50 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
19b60 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
19b70 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
19b80 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49  unt) {..CK_ATTRI
19b90 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
19ba0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
19bb0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
19bc0 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ty;..unsigned lo
19bd0 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c  ng identity_idx,
19be0 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f   attr_idx, sess_
19bf0 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64  attr_idx, num_id
19c00 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  s;..int mutex_re
19c10 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74  tval;..CK_RV ret
19c20 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43  val = CKR_OK;..C
19c30 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75  K_VOID_PTR pValu
19c40 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56  e;..CK_ULONG ulV
19c50 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45  alueLen;...CACKE
19c60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19c70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
19c80 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
19c90 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
19ca0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19cb0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
19cc0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
19cd0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
19ce0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
19cf0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
19d00 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
19d10 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
19d20 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
19d30 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
19d40 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
19d50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19d60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19d70 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
19d80 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
19d90 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
19da0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
19db0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f  ID);..}...if (hO
19dc0 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09  bject == 0) {...
19dd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19de0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a  NTF("Error.  Obj
19df0 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ect handle out o
19e00 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
19e10 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45  .return(CKR_OBJE
19e20 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  CT_HANDLE_INVALI
19e30 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43  D);..}...if (ulC
19e40 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  ount == 0) {.../
19e50 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c  * Short circuit,
19e60 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73   if zero objects
19e70 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20   were specified 
19e80 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d  return zero item
19e90 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f  s immediately */
19ea0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19eb0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
19ec0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
19ed0 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
19ee0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
19ef0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
19f00 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d  .if (pTemplate =
19f10 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
19f20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19f30 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61  "Error.  pTempla
19f40 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  te is NULL.");..
19f50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
19f60 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
19f70 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d  ..identity_idx =
19f80 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09   hObject - 1;...
19f90 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
19fa0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
19fb0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
19fc0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
19fd0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
19fe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19ff0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1a000 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1a010 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1a020 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1a030 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1a040 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1a050 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1a060 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1a070 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1a080 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a090 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a0a0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1a0b0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1a0c0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1a0d0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1a0e0 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20  ..}...num_ids = 
1a0f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1a100 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1a110 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66  ties_count;...if
1a120 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e   (identity_idx >
1a130 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63  = num_ids) {...c
1a140 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1a150 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1a160 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1a170 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a180 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c  r.  Object handl
1a190 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  e out of range. 
1a1a0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20   identity_idx = 
1a1b0 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25  %lu, num_ids = %
1a1c0 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu.", (unsigned 
1a1d0 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69  long) identity_i
1a1e0 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  dx, (unsigned lo
1a1f0 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09  ng) num_ids);...
1a200 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45  .return(CKR_OBJE
1a210 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  CT_HANDLE_INVALI
1a220 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74  D);..}...identit
1a230 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  y = &cackey_sess
1a240 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1a250 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69  dentities[identi
1a260 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28  ty_idx];...for (
1a270 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74  attr_idx = 0; at
1a280 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74  tr_idx < ulCount
1a290 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  ; attr_idx++) {.
1a2a0 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70  ..curr_attr = &p
1a2b0 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64  Template[attr_id
1a2c0 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20  x];....pValue = 
1a2d0 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
1a2e0 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
1a2f0 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
1a300 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69  UG_PRINTF("Looki
1a310 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65  ng for attribute
1a320 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69   0x%08lx (identi
1a330 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75  ty:%lu) ...", (u
1a340 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1a350 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28  rr_attr->type, (
1a360 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
1a370 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09  dentity_idx);...
1a380 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f  .for (sess_attr_
1a390 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74  idx = 0; sess_at
1a3a0 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  tr_idx < identit
1a3b0 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  y->attributes_co
1a3c0 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  unt; sess_attr_i
1a3d0 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69  dx++) {....if (i
1a3e0 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
1a3f0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
1a400 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f  x].type == curr_
1a410 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09  attr->type) {...
1a420 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a430 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e  RINTF(" ... foun
1a440 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25  d it, pValue = %
1a450 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  p, ulValueLen = 
1a460 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e  %lu", identity->
1a470 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
1a480 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
1a490 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  , identity->attr
1a4a0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
1a4b0 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
1a4c0 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c  );..........pVal
1a4d0 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61  ue = identity->a
1a4e0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
1a4f0 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b  ttr_idx].pValue;
1a500 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1a510 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  = identity->attr
1a520 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
1a530 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
1a540 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
1a550 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61   (curr_attr->pVa
1a560 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b  lue && pValue) {
1a570 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
1a580 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d  r->ulValueLen >=
1a590 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09   ulValueLen) {..
1a5a0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
1a5b0 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61  ttr->pValue, pVa
1a5c0 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29  lue, ulValueLen)
1a5d0 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
1a5e0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
1a5f0 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
1a600 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
1a610 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
1a620 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72  ....}...}....cur
1a630 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
1a640 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  en = ulValueLen;
1a650 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1a660 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1a670 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1a680 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1a690 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1a6a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a6b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a6c0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1a6d0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1a6e0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1a6f0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72  ROR);..}...if (r
1a700 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54  etval == CKR_ATT
1a710 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41  RIBUTE_TYPE_INVA
1a720 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  LID) {...CACKEY_
1a730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a740 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52  turning CKR_ATTR
1a750 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
1a760 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  ID (%i)", (int) 
1a770 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
1a780 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43   if (retval == C
1a790 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
1a7a0 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ALL) {...CACKEY_
1a7b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a7c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46  turning CKR_BUFF
1a7d0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69  ER_TOO_SMALL (%i
1a7e0 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
1a7f0 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72  );..} else if (r
1a800 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29  etval == CKR_OK)
1a810 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a820 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1a830 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1a840 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
1a850 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
1a860 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a870 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
1a880 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
1a890 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
1a8a0 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
1a8b0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1a8c0 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  , C_SetAttribute
1a8d0 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f  Value)(CK_SESSIO
1a8e0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1a8f0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
1a900 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
1a910 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
1a920 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
1a930 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41  G ulCount) {..CA
1a940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a950 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1a960 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1a970 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1a980 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a990 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1a9a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1a9b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1a9c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1a9d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1a9e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a9f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1aa00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1aa10 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1aa20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1aa30 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1aa40 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1aa50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1aa60 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1aa70 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
1aa80 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28  indObjectsInit)(
1aa90 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1aaa0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41  E hSession, CK_A
1aab0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
1aac0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
1aad0 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74   ulCount) {..int
1aae0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
1aaf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ab00 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1ab10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1ab20 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1ab30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ab40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1ab50 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1ab60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1ab70 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1ab80 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1ab90 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
1aba0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
1abb0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1abc0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1abd0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1abe0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1abf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ac00 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1ac10 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
1ac20 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1ac30 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1ac40 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1ac50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1ac60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1ac70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1ac80 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1ac90 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1aca0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1acb0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1acc0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1acd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1ace0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1acf0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1ad00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ad10 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1ad20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1ad30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ad40 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1ad50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ad60 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1ad70 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1ad80 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1ad90 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1ada0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1adb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1adc0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
1add0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1ade0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1adf0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1ae00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ae10 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
1ae20 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  ch already activ
1ae30 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1ae40 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
1ae50 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
1ae60 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1ae70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1ae80 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d  Session].slotID]
1ae90 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  .slot_reset) {..
1aea0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1aeb0 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20 68  INTF("The slot h
1aec0 61 73 20 62 65 65 6e 20 72 65 73 65 74 20 73 69  as been reset si
1aed0 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b  nce we last look
1aee0 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69 65  ed for identitie
1aef0 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22  s -- rescanning"
1af00 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  );....if (cackey
1af10 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1af20 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 21  on].identities !
1af30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63  = NULL) {....cac
1af40 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
1af50 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ies(cackey_sessi
1af60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
1af70 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79  entities, cackey
1af80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1af90 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
1afa0 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ount);.....cacke
1afb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1afc0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
1afd0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65  = NULL;....cacke
1afe0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1aff0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
1b000 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a  count = 0;...}..
1b010 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1b020 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1b030 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d  Session].slotID]
1b040 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b  .slot_reset = 0;
1b050 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1b060 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b070 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
1b080 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ].token_flags = 
1b090 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
1b0a0 45 44 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  ED;..}...if (cac
1b0b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1b0c0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1b0d0 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
1b0e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1b0f0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1b100 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
1b110 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61  d_identities(&ca
1b120 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65  ckey_slots[cacke
1b130 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1b140 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 26 63  ion].slotID], &c
1b150 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1b160 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1b170 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ies_count);..}..
1b180 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21  .if (pTemplate !
1b190 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
1b1a0 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
1b1b0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1b1c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1b1d0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
1b1e0 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61  = ulCount;....ca
1b1f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1b200 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
1b210 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c  uery = malloc(ul
1b220 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  Count * sizeof(*
1b230 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09  pTemplate));....
1b240 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
1b250 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b260 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20  ].search_query, 
1b270 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75  pTemplate, ulCou
1b280 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
1b290 6d 70 6c 61 74 65 29 29 3b 0a 09 09 7d 20 65 6c  mplate));...} el
1b2a0 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  se {....cackey_s
1b2b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b2c0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
1b2d0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63  ount = 0;....cac
1b2e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1b2f0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1b300 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  ery = NULL;...}.
1b310 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
1b320 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
1b330 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1b340 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1b350 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b  glock);.....CACK
1b360 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b370 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
1b380 71 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20  query specified 
1b390 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d  as NULL, but num
1b3a0 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72  ber of query ter
1b3b0 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  ms not specified
1b3c0 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65   as 0.");.....re
1b3d0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1b3e0 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09  TS_BAD);...}....
1b3f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b400 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1b410 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
1b420 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
1b430 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1b440 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c  arch_query = NUL
1b450 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  L;..}...cackey_s
1b460 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b470 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
1b480 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  = 1;..cackey_ses
1b490 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1b4a0 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d  search_curr_id =
1b4b0 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76   0;...mutex_retv
1b4c0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1b4d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1b4e0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1b4f0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1b500 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b510 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b520 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1b530 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1b540 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1b550 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1b560 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b570 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1b580 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1b590 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1b5a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1b5b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1b5c0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43  C_FindObjects)(C
1b5d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1b5e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
1b5f0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
1b600 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f  phObject, CK_ULO
1b610 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  NG ulMaxObjectCo
1b620 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  unt, CK_ULONG_PT
1b630 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  R pulObjectCount
1b640 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
1b650 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72  ey_identity *cur
1b660 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42  r_id;..CK_ATTRIB
1b670 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
1b680 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69  .CK_ULONG curr_i
1b690 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f  d_idx, curr_out_
1b6a0 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74  id_idx, curr_att
1b6b0 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
1b6c0 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _idx;..CK_ULONG 
1b6d0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70  matched_count, p
1b6e0 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
1b6f0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
1b700 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
1b710 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1b720 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1b730 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1b740 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1b750 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b760 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1b770 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1b780 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1b790 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1b7a0 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a  ..}...if (pulObj
1b7b0 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  ectCount == NULL
1b7c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b7d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b7e0 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  .  pulObjectCoun
1b7f0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
1b800 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1b810 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1b820 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d  .if (phObject ==
1b830 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62   NULL && ulMaxOb
1b840 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
1b850 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
1b860 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
1b870 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
1b880 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
1b890 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
1b8a0 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65  ly */...*pulObje
1b8b0 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  ctCount = 0;....
1b8c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b8d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1b8e0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
1b8f0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
1b900 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
1b910 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
1b920 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
1b930 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1b940 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b950 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73  or.  phObject is
1b960 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1b970 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1b980 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1b990 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  (ulMaxObjectCoun
1b9a0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
1b9b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b9c0 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d  "Error.  Maximum
1b9d0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
1b9e0 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ts specified as 
1b9f0 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75  zero.");....retu
1ba00 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1ba10 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1ba20 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1ba30 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1ba40 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1ba50 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1ba60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1ba70 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1ba80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ba90 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1baa0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1bab0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1bac0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1bad0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1bae0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1baf0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1bb00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1bb10 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1bb20 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1bb30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bb40 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1bb50 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1bb60 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1bb70 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1bb80 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1bb90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1bba0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1bbb0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1bbc0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1bbd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bbe0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1bbf0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
1bc00 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1bc10 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1bc20 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1bc30 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1bc40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1bc50 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
1bc60 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1bc70 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1bc80 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1bc90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bca0 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
1bcb0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1bcc0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1bcd0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
1bce0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1bcf0 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
1bd00 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
1bd10 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79  _id_idx = cackey
1bd20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1bd30 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
1bd40 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20  id; curr_id_idx 
1bd50 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
1bd60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1bd70 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20  tities_count && 
1bd80 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
1bd90 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29  ; curr_id_idx++)
1bda0 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26   {...curr_id = &
1bdb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1bdc0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1bdd0 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78  ties[curr_id_idx
1bde0 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ];....CACKEY_DEB
1bdf0 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65  UG_PRINTF("Proce
1be00 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  ssing identity:%
1be10 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
1be20 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78  ong) curr_id_idx
1be30 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f  );....matched_co
1be40 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20  unt = 0;....for 
1be50 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d  (curr_attr_idx =
1be60 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64   0; curr_attr_id
1be70 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
1be80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1be90 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
1bea0 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b  ; curr_attr_idx+
1beb0 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74  +) {....prev_mat
1bec0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74  ched_count = mat
1bed0 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09  ched_count;.....
1bee0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63  curr_attr = &cac
1bef0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1bf00 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1bf10 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64  ery[curr_attr_id
1bf20 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  x];.....CACKEY_D
1bf30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43  EBUG_PRINTF("  C
1bf40 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  hecking for attr
1bf50 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 69 6e  ibute 0x%08lx in
1bf60 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22   identity:%i..."
1bf70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1bf80 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  ) curr_attr->typ
1bf90 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  e, (int) curr_id
1bfa0 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59  _idx);....CACKEY
1bfb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
1bfc0 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69  "    Value looki
1bfd0 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61  ng for:", curr_a
1bfe0 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72  ttr->pValue, cur
1bff0 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
1c000 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65  en);.....for (se
1c010 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
1c020 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
1c030 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
1c040 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73  utes_count; sess
1c050 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
1c060 09 09 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e  ...if (curr_id->
1c070 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
1c080 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d  attr_idx].type =
1c090 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  = curr_attr->typ
1c0a0 65 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  e) {......CACKEY
1c0b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1c0c0 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74     ... found mat
1c0d0 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29  ching type ...")
1c0e0 3b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
1c0f0 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
1c100 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a    ... our value:
1c110 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  ", curr_id->attr
1c120 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
1c130 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75  _idx].pValue, cu
1c140 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
1c150 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
1c160 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  .ulValueLen);...
1c170 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
1c180 72 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c  r->pValue == NUL
1c190 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  L) {.......CACKE
1c1a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c1b0 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
1c1c0 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22   wildcard match"
1c1d0 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68 65  );........matche
1c1e0 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09  d_count++;......
1c1f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
1c200 0a 20 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  . .....if (curr_
1c210 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
1c220 20 3d 3d 20 63 75 72 72 5f 69 64 2d 3e 61 74 74   == curr_id->att
1c230 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
1c240 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  r_idx].ulValueLe
1c250 6e 20 26 26 20 6d 65 6d 63 6d 70 28 63 75 72 72  n && memcmp(curr
1c260 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
1c270 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
1c280 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1c290 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69  ].pValue, curr_i
1c2a0 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
1c2b0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
1c2c0 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b  alueLen) == 0) {
1c2d0 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1c2e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
1c2f0 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61     ... found exa
1c300 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09  ct match");.....
1c310 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ...matched_count
1c320 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ++;........break
1c330 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
1c340 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68  ..}...../* If th
1c350 65 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c  e attribute coul
1c360 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64  d not be matched
1c370 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  , do not try to 
1c380 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c  match additional
1c390 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09   attributes */..
1c3a0 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68  ..if (prev_match
1c3b0 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63  ed_count == matc
1c3c0 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  hed_count) {....
1c3d0 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
1c3e0 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f  ....if (matched_
1c3f0 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f  count == cackey_
1c400 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1c410 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
1c420 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
1c430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c440 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74  "  ... All %i at
1c450 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64  tributes checked
1c460 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69   for found, addi
1c470 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74  ng identity:%i t
1c480 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22  o returned list"
1c490 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73  , (int) cackey_s
1c4a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c4b0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
1c4c0 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72  ount, (int) curr
1c4d0 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68  _id_idx);.....ph
1c4e0 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f  Object[curr_out_
1c4f0 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69  id_idx] = curr_i
1c500 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75  d_idx + 1;.....u
1c510 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d  lMaxObjectCount-
1c520 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f  -;.....curr_out_
1c530 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c  id_idx++;...} el
1c540 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
1c550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
1c560 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f  .. Not all %i (o
1c570 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74  nly found %i) at
1c580 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64  tributes checked
1c590 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20   for found, not 
1c5a0 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a  adding identity:
1c5b0 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65  %i", (int) cacke
1c5c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1c5d0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1c5e0 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d  y_count, (int) m
1c5f0 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69  atched_count, (i
1c600 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
1c610 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79  ;...}..}..cackey
1c620 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1c630 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
1c640 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78  id = curr_id_idx
1c650 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  ;..*pulObjectCou
1c660 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64  nt = curr_out_id
1c670 5f 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  _idx;...mutex_re
1c680 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1c690 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1c6a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1c6b0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1c6c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1c6d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c6e0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1c6f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1c700 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1c710 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1c720 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c730 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1c740 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a  OK (%i), num obj
1c750 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52  ects = %lu", CKR
1c760 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43  _OK, *pulObjectC
1c770 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ount);...return(
1c780 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1c790 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1c7a0 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
1c7b0 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ctsFinal)(CK_SES
1c7c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1c7d0 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  sion) {..int mut
1c7e0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1c7f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c800 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1c810 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1c820 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1c830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c840 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1c850 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1c860 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1c870 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1c880 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
1c890 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1c8a0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1c8b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1c8c0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1c8d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1c8e0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1c8f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c900 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1c910 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1c920 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1c930 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1c940 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1c950 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1c960 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1c970 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1c980 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1c990 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1c9a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c9b0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1c9c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1c9d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1c9e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1c9f0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1ca00 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1ca10 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1ca20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1ca30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1ca40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ca50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1ca60 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1ca70 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1ca80 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1ca90 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1caa0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1cab0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1cac0 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
1cad0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1cae0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1caf0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1cb00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cb10 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
1cb20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1cb30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1cb40 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
1cb50 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1cb60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1cb70 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1cb80 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 69 66  _active = 0;..if
1cb90 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
1cba0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1cbb0 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72  ch_query) {...fr
1cbc0 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
1cbd0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1cbe0 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a  rch_query);..}..
1cbf0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1cc00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1cc10 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1cc20 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1cc30 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1cc40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cc50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1cc60 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1cc70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1cc80 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1cc90 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1cca0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1ccb0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1ccc0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1ccd0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1cce0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1ccf0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
1cd00 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  ryptInit)(CK_SES
1cd10 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1cd20 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
1cd30 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
1cd40 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
1cd50 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
1cd60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cd70 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1cd80 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1cd90 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1cda0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cdb0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1cdc0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1cdd0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1cde0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1cdf0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1ce00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ce10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1ce20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ce30 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1ce40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1ce50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1ce60 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1ce70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1ce80 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1ce90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
1cea0 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f  crypt)(CK_SESSIO
1ceb0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1cec0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1ced0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
1cee0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
1cef0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
1cf00 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
1cf10 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44  TR pulEncryptedD
1cf20 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
1cf30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cf40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1cf50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1cf60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1cf70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1cf80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1cf90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1cfa0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1cfb0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1cfc0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1cfd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1cfe0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1cff0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1d000 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1d010 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1d020 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1d030 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1d040 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1d050 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1d060 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
1d070 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
1d080 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1d090 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1d0a0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
1d0b0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
1d0c0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
1d0d0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
1d0e0 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
1d0f0 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
1d100 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d110 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1d120 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1d130 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1d140 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d150 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1d160 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1d170 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1d180 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1d190 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1d1a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d1b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1d1c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1d1d0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1d1e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1d1f0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1d200 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1d210 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1d220 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1d230 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1d240 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  EncryptFinal)(CK
1d250 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1d260 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1d270 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79  E_PTR pLastEncry
1d280 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
1d290 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e  NG_PTR pulLastEn
1d2a0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
1d2b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1d2c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1d2d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1d2e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1d2f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d300 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1d310 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1d320 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d330 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1d340 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1d350 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d360 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1d370 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1d380 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1d390 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1d3a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1d3b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1d3c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1d3d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1d3e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1d3f0 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29  , C_DecryptInit)
1d400 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1d410 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1d420 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
1d430 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
1d440 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
1d450 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
1d460 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a  tval;...hKey--;.
1d470 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d480 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1d490 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1d4a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1d4b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d4c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1d4d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1d4e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d4f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1d500 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1d510 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d  if (pMechanism =
1d520 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1d530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d540 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
1d550 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  sm is NULL.");..
1d560 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1d570 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1d580 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
1d590 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43  ->mechanism != C
1d5a0 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09  KM_RSA_PKCS) {..
1d5b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d5c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
1d5d0 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
1d5e0 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  sm not specified
1d5f0 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   as CKM_RSA_PKCS
1d600 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1d610 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41  R_MECHANISM_PARA
1d620 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  M_INVALID);..}..
1d630 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1d640 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1d650 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1d660 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1d670 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1d680 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1d690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d6a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1d6b0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1d6c0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1d6d0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1d6e0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1d6f0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1d700 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1d710 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1d720 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1d730 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1d740 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d750 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1d760 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1d770 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1d780 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1d790 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1d7a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d7b0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1d7c0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1d7d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d7e0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1d7f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d800 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1d810 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1d820 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1d830 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1d840 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1d850 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d860 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
1d870 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1d880 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1d890 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1d8a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d8b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
1d8c0 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69  ecrypt already i
1d8d0 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
1d8e0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1d8f0 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
1d900 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
1d910 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
1d920 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
1d930 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
1d940 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1d950 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1d960 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1d970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d980 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
1d990 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  le out of range 
1d9a0 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25  (requested key %
1d9b0 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65  lu, only %lu ide
1d9c0 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c  ntities availabl
1d9d0 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e).", (unsigned 
1d9e0 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73  long) hKey, (uns
1d9f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b  igned long) cack
1da00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1da10 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1da20 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
1da30 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c  rn(CKR_KEY_HANDL
1da40 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1da50 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1da60 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
1da70 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  pt_active = 1;..
1da80 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1da90 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
1daa0 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  pt_mechanism = p
1dab0 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
1dac0 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65  nism;..cackey_se
1dad0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1dae0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61  .decrypt_mech_pa
1daf0 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d  rm = pMechanism-
1db00 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61  >pParameter;..ca
1db10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1db20 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1db30 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70  mech_parmlen = p
1db40 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72  Mechanism->ulPar
1db50 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b  ameterLen;..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 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
1db90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1dba0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
1dbb0 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  Key];...mutex_re
1dbc0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1dbd0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1dbe0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1dbf0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1dc00 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1dc10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1dc20 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1dc30 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1dc40 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1dc50 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1dc60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dc70 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1dc80 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1dc90 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1dca0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1dcb0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1dcc0 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f  , C_Decrypt)(CK_
1dcd0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1dce0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1dcf0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
1dd00 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
1dd10 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
1dd20 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
1dd30 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
1dd40 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a  R pulDataLen) {.
1dd50 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65  .CK_ULONG datale
1dd60 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65  n_update, datale
1dd70 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20  n_final;..CK_RV 
1dd80 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a 09 43  decrypt_ret;...C
1dd90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dda0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1ddb0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1ddc0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1ddd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1dde0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1ddf0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1de00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1de10 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1de20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1de30 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e  (pulDataLen == N
1de40 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1de50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1de60 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20  ror. pulDataLen 
1de70 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1de80 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1de90 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64  NTS_BAD);..}...d
1dea0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20  atalen_update = 
1deb0 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64  *pulDataLen;...d
1dec0 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44  ecrypt_ret = C_D
1ded0 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65  ecryptUpdate(hSe
1dee0 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65  ssion, pEncrypte
1def0 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74  dData, ulEncrypt
1df00 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61  edDataLen, pData
1df10 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  , &datalen_updat
1df20 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74  e);..if (decrypt
1df30 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
1df40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1df50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1df60 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29   DecryptUpdate()
1df70 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
1df80 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
1df90 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1dfa0 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
1dfb0 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
1dfc0 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
1dfd0 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20  Data) {...pData 
1dfe0 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  += datalen_updat
1dff0 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66  e;..}..datalen_f
1e000 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c  inal = *pulDataL
1e010 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64  en - datalen_upd
1e020 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72  ate;...decrypt_r
1e030 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69  et = C_DecryptFi
1e040 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  nal(hSession, pD
1e050 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69  ata, &datalen_fi
1e060 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79  nal);..if (decry
1e070 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
1e080 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e090 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e0a0 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28  .  DecryptFinal(
1e0b0 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
1e0c0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
1e0d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1e0e0 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
1e0f0 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
1e100 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  _ret);..}...*pul
1e110 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65  DataLen = datale
1e120 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c  n_update + datal
1e130 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b  en_final;...CACK
1e140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e150 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1e160 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1e170 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1e180 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1e190 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1e1a0 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
1e1b0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1e1c0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1e1d0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
1e1e0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
1e1f0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
1e200 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
1e210 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
1e220 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
1e230 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  n) {..static CK_
1e240 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b  BYTE buf[16384];
1e250 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  ..ssize_t buflen
1e260 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
1e270 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
1e280 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ROR;..int mutex_
1e290 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1e2a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1e2b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1e2c0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1e2d0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1e2e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e2f0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1e300 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1e310 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1e320 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1e330 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1e340 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1e350 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1e360 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1e370 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1e380 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1e390 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e3a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e3b0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1e3c0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1e3d0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1e3e0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1e3f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e  D);..}...if (pEn
1e400 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e  cryptedPart == N
1e410 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74  ULL && ulEncrypt
1e420 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  edPartLen == 0) 
1e430 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
1e440 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61  cuit if we are a
1e450 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20  sked to decrypt 
1e460 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
1e470 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e480 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1e490 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
1e4a0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
1e4b0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
1e4c0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
1e4d0 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
1e4e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1e4f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e500 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79  F("Error. pEncry
1e510 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c  ptedPart is NULL
1e520 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65  , but ulEncrypte
1e530 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  dPartLen is not 
1e540 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
1e550 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1e560 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45  D);..}...if (ulE
1e570 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
1e580 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1e590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e5a0 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65  rror. ulEncrypte
1e5b0 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62  dPartLen is 0, b
1e5c0 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20  ut pPart is not 
1e5d0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1e5e0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1e5f0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1e600 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  pulPartLen == NU
1e610 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1e620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e630 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69  or. pulPartLen i
1e640 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1e650 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1e660 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
1e670 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1e680 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1e690 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1e6a0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1e6b0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1e6c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e6d0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1e6e0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1e6f0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1e700 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1e710 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1e720 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1e730 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1e740 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e750 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1e760 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e770 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1e780 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1e790 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1e7a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1e7b0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1e7c0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1e7d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1e7e0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
1e7f0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1e800 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1e810 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1e820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e830 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
1e840 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
1e850 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1e860 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
1e870 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1e880 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b  }...switch (cack
1e890 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1e8a0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
1e8b0 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
1e8c0 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
1e8d0 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74  .../* Ask card t
1e8e0 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09  o decrypt */....
1e8f0 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
1e900 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
1e910 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79  key_slots[cackey
1e920 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1e930 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 63 61 63  on].slotID], cac
1e940 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1e950 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
1e960 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70  dentity, pEncryp
1e970 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79  tedPart, ulEncry
1e980 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66  ptedPartLen, buf
1e990 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30  , sizeof(buf), 0
1e9a0 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75  , 1);.....if (bu
1e9b0 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09  flen < 0) {.....
1e9c0 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61  /* Decryption fa
1e9d0 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74  iled. */.....ret
1e9e0 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
1e9f0 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c  L_ERROR;....} el
1ea00 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65  se if (((unsigne
1ea10 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20  d long) buflen) 
1ea20 3e 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26  > *pulPartLen &&
1ea30 20 70 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a   pPart) {...../*
1ea40 20 44 65 63 72 79 70 74 65 64 20 64 61 74 61 20   Decrypted data 
1ea50 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09  too large */....
1ea60 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  .retval = CKR_BU
1ea70 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a  FFER_TOO_SMALL;.
1ea80 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1ea90 69 66 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09  if (pPart) {....
1eaa0 09 09 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20  ..memcpy(pPart, 
1eab0 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09  buf, buflen);...
1eac0 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72  ..}......*pulPar
1ead0 74 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a  tLen = buflen;..
1eae0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
1eaf0 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72  _OK;....}.....br
1eb00 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  eak;..}...mutex_
1eb10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1eb20 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1eb30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1eb40 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1eb50 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1eb60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1eb70 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1eb80 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1eb90 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1eba0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1ebb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ebc0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69  TF("Returning %i
1ebd0 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
1ebe0 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
1ebf0 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
1ec00 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1ec10 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29   C_DecryptFinal)
1ec20 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1ec30 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1ec40 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61  BYTE_PTR pLastPa
1ec50 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
1ec60 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29   pulLastPartLen)
1ec70 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
1ec80 74 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69  tval;..int termi
1ec90 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31  nate_decrypt = 1
1eca0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1ecb0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1ecc0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1ecd0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1ece0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ecf0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ed00 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ed10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ed20 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1ed30 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1ed40 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1ed50 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1ed60 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1ed70 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1ed80 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1ed90 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1eda0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1edb0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1edc0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1edd0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1ede0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1edf0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1ee00 0a 0a 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61  ...if (pulLastPa
1ee10 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  rtLen == NULL) {
1ee20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ee30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1ee40 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73  ulLastPartLen is
1ee50 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1ee60 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1ee70 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
1ee80 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1ee90 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1eea0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1eeb0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1eec0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1eed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1eee0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1eef0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1ef00 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1ef10 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1ef20 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1ef30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1ef40 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1ef50 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1ef60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1ef70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ef80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1ef90 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
1efa0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1efb0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1efc0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1efd0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1efe0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1eff0 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
1f000 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1f010 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1f020 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1f030 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f040 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
1f050 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
1f060 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1f070 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
1f080 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1f090 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c  ...*pulLastPartL
1f0a0 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c  en = 0;...if (pL
1f0b0 61 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29  astPart == NULL)
1f0c0 20 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64   {...terminate_d
1f0d0 65 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a  ecrypt = 0;..}..
1f0e0 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64  .if (terminate_d
1f0f0 65 63 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b  ecrypt) {...cack
1f100 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1f110 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
1f120 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d  tive = 0;..}...m
1f130 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1f140 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1f150 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f160 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1f170 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1f180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f190 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1f1a0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1f1b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1f1c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1f1d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1f1e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1f1f0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1f200 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1f210 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1f220 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1f230 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
1f240 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  tInit)(CK_SESSIO
1f250 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1f260 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
1f270 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20  PTR pMechanism) 
1f280 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1f290 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f2a0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1f2b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1f2c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f2d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1f2e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1f2f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f300 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1f310 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1f320 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f330 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1f340 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1f350 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1f360 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1f370 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1f380 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1f390 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1f3a0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1f3b0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1f3c0 2c 20 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53  , C_Digest)(CK_S
1f3d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1f3e0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1f3f0 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
1f400 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
1f410 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65  K_BYTE_PTR pDige
1f420 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
1f430 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b   pulDigestLen) {
1f440 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f450 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1f460 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1f470 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1f480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f490 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1f4a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1f4b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f4c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1f4d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1f4e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f4f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1f500 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f510 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1f520 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1f530 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1f540 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1f550 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f560 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1f570 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1f580 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 29   C_DigestUpdate)
1f590 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1f5a0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1f5b0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
1f5c0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
1f5d0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1f5e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1f5f0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1f600 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1f610 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f620 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f630 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1f640 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1f650 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1f660 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1f670 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1f680 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f690 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1f6a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1f6b0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1f6c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f6d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f6e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1f6f0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1f700 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1f710 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65  K_RV, C_DigestKe
1f720 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
1f730 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1f740 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1f750 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
1f760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1f770 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1f780 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1f790 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1f7a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f7b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1f7c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1f7d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1f7e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1f7f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1f800 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1f810 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1f820 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f830 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1f840 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1f850 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1f860 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1f870 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1f880 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1f890 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
1f8a0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
1f8b0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1f8c0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1f8d0 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Digest, CK_ULONG
1f8e0 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65  _PTR pulDigestLe
1f8f0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
1f900 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f910 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1f920 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1f930 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f940 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f950 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1f960 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f970 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1f980 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1f990 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1f9a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1f9b0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1f9c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1f9d0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1f9e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f9f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1fa00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1fa10 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1fa20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1fa30 5f 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29  _RV, C_SignInit)
1fa40 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1fa50 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1fa60 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
1fa70 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
1fa80 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
1fa90 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
1faa0 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a  tval;...hKey--;.
1fab0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fac0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1fad0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1fae0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1faf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fb00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1fb10 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1fb20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1fb30 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1fb40 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1fb50 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d  if (pMechanism =
1fb60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1fb70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fb80 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
1fb90 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  sm is NULL.");..
1fba0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1fbb0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1fbc0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
1fbd0 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43  ->mechanism != C
1fbe0 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 26 26 20 70  KM_RSA_PKCS && p
1fbf0 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
1fc00 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 53 48 41 31  nism != CKM_SHA1
1fc10 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
1fc20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fc30 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
1fc40 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
1fc50 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
1fc60 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 6f  s CKM_RSA_PKCS o
1fc70 72 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50  r CKM_SHA1_RSA_P
1fc80 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  KCS");....return
1fc90 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  (CKR_MECHANISM_P
1fca0 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  ARAM_INVALID);..
1fcb0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
1fcc0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
1fcd0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
1fce0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1fcf0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1fd00 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
1fd10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fd20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1fd30 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
1fd40 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
1fd50 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1fd60 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1fd70 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1fd80 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1fd90 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1fda0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1fdb0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1fdc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fdd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1fde0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1fdf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fe00 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1fe10 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1fe20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1fe30 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
1fe40 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1fe50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1fe60 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1fe70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1fe80 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
1fe90 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
1fea0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1feb0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1fec0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
1fed0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1fee0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
1fef0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1ff00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1ff10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1ff20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ff30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1ff40 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e 20 70  ign already in p
1ff50 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09  rogress.");.....
1ff60 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
1ff70 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09  ATION_ACTIVE);..
1ff80 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20  }...if (hKey >= 
1ff90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ffa0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1ffb0 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ties_count) {...
1ffc0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1ffd0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1ffe0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1fff0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20000 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20  or.  Key handle 
20010 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65  out of range (re
20020 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c  quested key %lu,
20030 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69   only %lu identi
20040 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e  ties available).
20050 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
20060 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e  g) hKey, (unsign
20070 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f  ed long) cackey_
20080 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20090 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
200a0 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
200b0 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49  CKR_KEY_HANDLE_I
200c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
200d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
200e0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
200f0 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65  ive = 1;...cacke
20100 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20110 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
20120 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  ism = pMechanism
20130 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63  ->mechanism;...c
20140 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20150 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
20160 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63  flen = 128;..cac
20170 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20180 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
20190 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  sed = 0;..cackey
201a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
201b0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 6d  on].sign_buf = m
201c0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61  alloc(sizeof(*ca
201d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
201e0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
201f0 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) * cackey_sessi
20200 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
20210 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 41  gn_buflen);...CA
20220 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20230 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75 20 73  F("Session %lu s
20240 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69 73 20  ign_identity is 
20250 25 70 20 28 69 64 65 6e 74 69 74 79 20 23 25 6c  %p (identity #%l
20260 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
20270 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c 20 26  ong) hSession, &
20280 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20290 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
202a0 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73  ties[hKey], (uns
202b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79  igned long) hKey
202c0 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  );..cackey_sessi
202d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
202e0 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63  gn_identity = &c
202f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20300 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
20310 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74  ies[hKey];...mut
20320 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
20330 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20340 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20350 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
20360 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
20370 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20380 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
20390 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
203a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
203b0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
203c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
203d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
203e0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
203f0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
20400 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
20410 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20420 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43  CK_RV, C_Sign)(C
20430 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
20440 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
20450 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
20460 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
20470 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
20480 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
20490 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
204a0 75 72 65 4c 65 6e 29 20 7b 0a 09 43 4b 5f 52 56  ureLen) {..CK_RV
204b0 20 73 69 67 6e 5f 72 65 74 3b 0a 0a 09 43 41 43   sign_ret;...CAC
204c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
204d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
204e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
204f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
20500 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20510 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
20520 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
20530 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
20540 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
20550 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f  ZED);..}...sign_
20560 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ret = C_SignUpda
20570 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  te(hSession, pDa
20580 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a  ta, ulDataLen);.
20590 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d  .if (sign_ret !=
205a0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
205b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
205c0 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70  ("Error.  SignUp
205d0 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20  date() returned 
205e0 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
205f0 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
20600 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
20610 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
20620 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f  ret);..}...sign_
20630 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  ret = C_SignFina
20640 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67  l(hSession, pSig
20650 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61  nature, pulSigna
20660 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73  tureLen);..if (s
20670 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
20680 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
20690 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
206a0 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 29 20  r.  SignFinal() 
206b0 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
206c0 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
206d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
206e0 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ign_ret);....ret
206f0 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09  urn(sign_ret);..
20700 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
20710 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20720 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
20730 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
20740 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
20750 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
20760 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55  N(CK_RV, C_SignU
20770 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
20780 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
20790 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
207a0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
207b0 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74  lPartLen) {..int
207c0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
207d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
207e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
207f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20800 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20810 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20820 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20830 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20840 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20850 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20860 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
20870 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
20880 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
20890 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
208a0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
208b0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
208c0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
208d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
208e0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
208f0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
20900 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
20910 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
20920 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
20930 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c  if (pPart == NUL
20940 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d  L && ulPartLen =
20950 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
20960 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20  t circuit if we 
20970 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67  are asked to sig
20980 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a  n nothing... */.
20990 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
209a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
209b0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
209c0 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
209d0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
209e0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
209f0 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c  if (pPart == NUL
20a00 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
20a10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20a20 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c  r. pPart is NULL
20a30 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20  , but ulPartLen 
20a40 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09  is not 0.");....
20a50 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
20a60 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
20a70 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d  if (ulPartLen ==
20a80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20a90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20aa0 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  or. ulPartLen is
20ab0 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73   0, but pPart is
20ac0 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
20ad0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
20ae0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
20af0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
20b00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
20b10 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
20b20 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
20b30 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
20b40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20b50 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
20b60 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
20b70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
20b80 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
20b90 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
20ba0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
20bb0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
20bc0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
20bd0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
20be0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
20bf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20c00 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
20c10 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
20c20 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
20c30 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
20c40 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
20c50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20c60 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
20c70 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
20c80 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
20c90 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
20ca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20cb0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
20cc0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
20cd0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
20ce0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
20cf0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
20d00 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
20d10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20d20 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
20d30 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
20d40 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
20d50 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63  Accumulate direc
20d60 74 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63  tly */....if ((c
20d70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20d80 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
20d90 66 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65  fused + ulPartLe
20da0 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73  n) > cackey_sess
20db0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
20dc0 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09  ign_buflen) {...
20dd0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
20de0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
20df0 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09  _buflen *= 2;...
20e00 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
20e10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
20e20 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28  n_buf = realloc(
20e30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20e40 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
20e50 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b  uf, sizeof(*cack
20e60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20e70 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20  sion].sign_buf) 
20e80 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  * cackey_session
20e90 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
20ea0 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a  _buflen);....}..
20eb0 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
20ec0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20ed0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63  on].sign_buf + c
20ee0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20ef0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
20f00 66 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c  fused, pPart, ul
20f10 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61  PartLen);.....ca
20f20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20f30 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
20f40 75 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65  used += ulPartLe
20f50 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  n;.....break;...
20f60 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53  case CKM_SHA1_RS
20f70 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 58 58  A_PKCS:..../* XX
20f80 58 3a 20 41 63 63 75 6d 75 6c 61 74 65 20 69 6e  X: Accumulate in
20f90 74 6f 20 61 20 53 48 41 31 20 68 61 73 68 20 2a  to a SHA1 hash *
20fa0 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  /....cackey_mute
20fb0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20fc0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41  biglock);.....CA
20fd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20fe0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
20ff0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21000 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
21010 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21020 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09  SUPPORTED);.....
21030 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
21040 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21050 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  D);....break;..}
21060 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
21070 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
21080 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
21090 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
210a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
210b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
210c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
210d0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
210e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
210f0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21100 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
21110 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21120 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
21130 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
21140 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
21150 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21160 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
21170 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ignFinal)(CK_SES
21180 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
21190 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
211a0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
211b0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
211c0 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73  gnatureLen) {..s
211d0 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69  tatic CK_BYTE si
211e0 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69  gbuf[1024];..ssi
211f0 7a 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a  ze_t sigbuflen;.
21200 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
21210 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
21220 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  R;..int terminat
21230 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74  e_sign = 1;..int
21240 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
21250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21260 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21270 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21280 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21290 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
212a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
212b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
212c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
212d0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
212e0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
212f0 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  f (pulSignatureL
21300 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
21310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21320 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53  NTF("Error. pulS
21330 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e  ignatureLen is N
21340 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
21350 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
21360 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  BAD);..}...if (h
21370 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
21380 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
21390 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
213a0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
213b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
213c0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
213d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
213e0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
213f0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
21400 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
21410 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
21420 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
21430 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21440 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
21450 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21460 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21470 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21480 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21490 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
214a0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
214b0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
214c0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
214d0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
214e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
214f0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
21500 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21510 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
21520 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21530 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
21540 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
21550 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
21560 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
21570 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
21580 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
21590 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
215a0 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
215b0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
215c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
215d0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
215e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
215f0 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
21600 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
21610 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
21620 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
21630 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  IZED);..}...swit
21640 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
21650 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
21660 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  gn_mechanism) {.
21670 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
21680 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
21690 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09  ard to sign */..
216a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
216b0 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f  RINTF("Asking to
216c0 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74   sign from ident
216d0 69 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f  ity %p in sessio
216e0 6e 20 25 6c 75 22 2c 20 63 61 63 6b 65 79 5f 73  n %lu", cackey_s
216f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21700 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c  ].sign_identity,
21710 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
21720 20 68 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73   hSession);....s
21730 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65  igbuflen = cacke
21740 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63  y_signdecrypt(&c
21750 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b  ackey_slots[cack
21760 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21770 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 63  sion].slotID], c
21780 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21790 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
217a0 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73  entity, cackey_s
217b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
217c0 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b  ].sign_buf, cack
217d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
217e0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
217f0 6e 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f  n, sigbuf, sizeo
21800 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29  f(sigbuf), 1, 0)
21810 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66  ;.....if (sigbuf
21820 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f  len < 0) {...../
21830 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64  * Signing failed
21840 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20  . */.....retval 
21850 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
21860 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69  ROR;....} else i
21870 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
21880 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e  ng) sigbuflen) >
21890 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65   *pulSignatureLe
218a0 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65 29  n && pSignature)
218b0 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64   {...../* Signed
218c0 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
218d0 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  */.....CACKEY_DE
218e0 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76  BUG_PRINTF("retv
218f0 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
21900 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62  TOO_SMALL;  sigb
21910 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c  uflen = %lu, pul
21920 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25  SignatureLen = %
21930 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
21940 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20  ong) sigbuflen, 
21950 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
21960 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
21970 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  );......retval =
21980 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
21990 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d  SMALL;......term
219a0 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a  inate_sign = 0;.
219b0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
219c0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
219d0 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69   0;......if (pSi
219e0 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09  gnature) {......
219f0 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72  memcpy(pSignatur
21a00 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62 75  e, sigbuf, sigbu
21a10 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72  flen);.......ter
21a20 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b  minate_sign = 1;
21a30 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c  .....}......*pul
21a40 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73  SignatureLen = s
21a50 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72  igbuflen;......r
21a60 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
21a70 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
21a80 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f  ..case CKM_SHA1_
21a90 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
21aa0 58 58 58 3a 20 41 63 63 75 6d 75 6c 61 74 65 20  XXX: Accumulate 
21ab0 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73 68  into a SHA1 hash
21ac0 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75   */....cackey_mu
21ad0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21ae0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
21af0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21b00 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
21b10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21b20 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
21b30 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
21b40 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
21b50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
21b60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21b70 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  TED);....break;.
21b80 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61  .}...if (termina
21b90 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20  te_sign) {...if 
21ba0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21bb0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
21bc0 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63  buf) {....free(c
21bd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21be0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
21bf0 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  f);...}....cacke
21c00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21c10 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
21c20 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
21c30 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
21c40 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
21c50 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
21c60 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
21c70 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
21c80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21c90 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
21ca0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
21cb0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
21cc0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
21cd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21ce0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
21cf0 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  i", (int) retval
21d00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
21d10 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
21d20 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21d30 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49  , C_SignRecoverI
21d40 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
21d50 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
21d60 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
21d70 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
21d80 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
21d90 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
21da0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
21db0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
21dc0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21dd0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21de0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21df0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21e00 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21e10 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21e20 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21e30 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21e40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21e50 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21e60 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21e70 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
21e80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21e90 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
21ea0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21eb0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
21ec0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
21ed0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
21ee0 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  over)(CK_SESSION
21ef0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
21f00 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
21f10 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
21f20 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
21f30 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
21f40 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
21f50 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
21f60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21f70 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
21f80 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
21f90 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
21fa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21fb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
21fc0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
21fd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21fe0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
21ff0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22010 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22020 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22030 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
22040 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22050 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
22060 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
22070 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22080 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
22090 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
220a0 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43   C_VerifyInit)(C
220b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
220c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
220d0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
220e0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
220f0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
22100 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22110 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22120 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22130 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22150 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22160 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22170 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22180 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22190 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
221a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
221b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
221c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
221d0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
221e0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
221f0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
22200 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
22210 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22220 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
22230 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22240 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45   C_Verify)(CK_SE
22250 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
22260 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
22270 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
22280 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
22290 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
222a0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
222b0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
222c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
222d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
222e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
222f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22310 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22320 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22330 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22340 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22350 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22370 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22380 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22390 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
223a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
223b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
223c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
223d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
223e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
223f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22400 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 29   C_VerifyUpdate)
22410 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
22420 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
22430 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
22440 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
22450 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
22460 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22470 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
22480 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
22490 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
224a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
224b0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
224c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
224d0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
224e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
224f0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22500 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22510 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
22520 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
22530 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
22540 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22550 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
22560 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22570 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
22580 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22590 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69  K_RV, C_VerifyFi
225a0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
225b0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
225c0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
225d0 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
225e0 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
225f0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
22600 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
22610 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
22620 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
22630 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22640 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22650 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
22660 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22670 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
22680 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
22690 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
226a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
226b0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
226c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
226d0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
226e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
226f0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
22700 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22710 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
22720 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22730 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f  RV, C_VerifyReco
22740 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  verInit)(CK_SESS
22750 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
22760 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
22770 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
22780 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
22790 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
227a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
227b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
227c0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
227d0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
227e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
227f0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22800 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22810 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22820 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22830 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
22840 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22850 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
22860 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22870 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
22880 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22890 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
228a0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
228b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
228c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
228d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
228e0 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53  ifyRecover)(CK_S
228f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
22900 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
22910 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
22920 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
22930 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  tureLen, CK_BYTE
22940 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
22950 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61  LONG_PTR pulData
22960 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
22970 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22980 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
22990 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
229a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
229b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
229c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
229d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
229e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
229f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
22a00 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
22a10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22a20 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
22a30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
22a40 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
22a50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22a60 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
22a70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22a80 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
22a90 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
22aa0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45  CK_RV, C_DigestE
22ab0 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
22ac0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
22ad0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
22ae0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
22af0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
22b00 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
22b10 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
22b20 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
22b30 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
22b40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22b50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22b60 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22b70 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22b80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22b90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22ba0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22bb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22bc0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22bd0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22be0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22bf0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22c00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22c10 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
22c20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22c30 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
22c40 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
22c50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22c60 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
22c70 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22c80 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74   C_DecryptDigest
22c90 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
22ca0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
22cb0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
22cc0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
22cd0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
22ce0 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
22cf0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
22d00 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
22d10 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
22d20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22d30 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
22d40 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
22d50 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
22d60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22d70 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22d80 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22d90 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22da0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22db0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
22dc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22dd0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
22de0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22df0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
22e00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22e10 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
22e20 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
22e30 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
22e40 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
22e50 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
22e60 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  nEncryptUpdate)(
22e70 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22e80 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
22e90 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
22ea0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
22eb0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
22ec0 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
22ed0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
22ee0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
22ef0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
22f00 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22f10 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22f20 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22f30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22f40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22f50 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22f60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22f70 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22f80 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22f90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22fa0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
22fb0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22fc0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
22fd0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
22fe0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
22ff0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
23000 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23010 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
23020 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
23030 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72 69  V, C_DecryptVeri
23040 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  fyUpdate)(CK_SES
23050 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
23060 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
23070 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
23080 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
23090 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
230a0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
230b0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
230c0 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
230d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
230e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
230f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
23100 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
23110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23120 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
23130 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
23140 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
23150 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
23160 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
23170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23180 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
23190 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
231a0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
231b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
231c0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...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 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
231f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
23200 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
23210 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53  enerateKey)(CK_S
23220 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
23230 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
23240 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
23250 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ism, CK_ATTRIBUT
23260 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
23270 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
23280 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
23290 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
232a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
232b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
232c0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
232d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
232e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
232f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
23300 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
23310 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23320 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
23330 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
23340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23350 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23360 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23370 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
23380 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
23390 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
233a0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
233b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
233c0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
233d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
233e0 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61   C_GenerateKeyPa
233f0 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ir)(CK_SESSION_H
23400 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
23410 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
23420 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
23430 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
23440 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65  ublicKeyTemplate
23450 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62  , CK_ULONG ulPub
23460 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74 65 43  licKeyAttributeC
23470 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ount, CK_ATTRIBU
23480 54 45 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b  TE_PTR pPrivateK
23490 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55  eyTemplate, CK_U
234a0 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65  LONG ulPrivateKe
234b0 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  yAttributeCount,
234c0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
234d0 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65  E_PTR phPublicKe
234e0 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
234f0 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61 74  DLE_PTR phPrivat
23500 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eKey) {..CACKEY_
23510 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23520 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23530 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23540 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23560 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23570 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23580 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23590 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
235a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
235b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
235c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
235d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
235e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
235f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23600 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
23610 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23620 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
23630 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
23640 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65  (CK_RV, C_WrapKe
23650 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
23660 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
23670 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
23680 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
23690 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72  BJECT_HANDLE hWr
236a0 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42  appingKey, CK_OB
236b0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
236c0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57  , CK_BYTE_PTR pW
236d0 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c  rappedKey, CK_UL
236e0 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70  ONG_PTR pulWrapp
236f0 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43  edKeyLen) {..CAC
23700 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23710 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
23720 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
23730 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
23740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23750 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
23760 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
23770 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
23780 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
23790 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
237a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
237b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
237c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
237d0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
237e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
237f0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
23800 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
23810 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
23820 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
23830 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e  TION(CK_RV, C_Un
23840 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53  wrapKey)(CK_SESS
23850 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23860 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
23870 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
23880 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
23890 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65  LE hUnwrappingKe
238a0 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  y, CK_BYTE_PTR p
238b0 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55  WrappedKey, CK_U
238c0 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65  LONG ulWrappedKe
238d0 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  yLen, CK_ATTRIBU
238e0 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
238f0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74  , CK_ULONG ulAtt
23900 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
23910 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
23920 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
23930 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23940 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
23950 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
23960 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
23970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23980 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
23990 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
239a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
239b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
239c0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
239d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
239e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
239f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23a00 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
23a10 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23a20 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
23a30 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
23a40 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
23a50 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
23a60 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72  ION(CK_RV, C_Der
23a70 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  iveKey)(CK_SESSI
23a80 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
23a90 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
23aa0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
23ab0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
23ac0 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41  E hBaseKey, CK_A
23ad0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
23ae0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
23af0 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e   ulAttributeCoun
23b00 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
23b10 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
23b20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23b30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
23b40 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
23b50 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
23b60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23b70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
23b80 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
23b90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23ba0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
23bb0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
23bc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23bd0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23be0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23bf0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
23c00 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
23c10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
23c20 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
23c30 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23c40 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
23c50 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23c60 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43   C_SeedRandom)(C
23c70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
23c80 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
23c90 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b  TE_PTR pSeed, CK
23ca0 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e  _ULONG ulSeedLen
23cb0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
23cc0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
23cd0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
23ce0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23cf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23d00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23d10 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
23d20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23d30 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23d40 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23d50 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23d60 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23d70 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
23d80 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
23d90 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
23da0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
23db0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
23dc0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23dd0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
23de0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23df0 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61  RV, C_GenerateRa
23e00 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
23e10 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
23e20 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52  , CK_BYTE_PTR pR
23e30 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c  andomData, CK_UL
23e40 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29  ONG ulRandomLen)
23e50 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
23e60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
23e70 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
23e80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
23e90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23ea0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23eb0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
23ec0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23ed0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
23ee0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
23ef0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23f00 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
23f10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
23f20 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
23f30 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
23f40 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
23f50 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
23f60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23f70 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72  TED);.}../* Depr
23f80 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
23f90 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
23fa0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
23fb0 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
23fc0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
23fd0 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
23fe0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23ff0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
24000 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24010 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
24020 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
24030 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29  OT_PARALLEL (%i)
24040 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
24050 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
24060 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
24070 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
24080 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d  L);...hSession =
24090 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75   hSession; /* Su
240a0 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72  press unused var
240b0 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f  iable warning */
240c0 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65  .}../* Deprecate
240d0 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b  d Function */.CK
240e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
240f0 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c  (CK_RV, C_Cancel
24100 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53  Function)(CK_SES
24110 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24120 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  sion) {..CACKEY_
24130 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24140 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
24150 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24160 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
24170 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
24180 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  LEL (%i)", CKR_F
24190 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
241a0 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  LLEL);...return(
241b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
241c0 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53  _PARALLEL);...hS
241d0 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f  ession = hSessio
241e0 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  n; /* Supress un
241f0 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
24200 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
24210 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
24220 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74  K_RV, C_GetFunct
24230 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43  ionList)(CK_FUNC
24240 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54  TION_LIST_PTR_PT
24250 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  R ppFunctionList
24260 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e  ) {..CK_FUNCTION
24270 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63 74  _LIST_PTR pFunct
24280 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45  ionList;...CACKE
24290 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
242a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
242b0 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  (ppFunctionList 
242c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
242d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
242e0 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 74  ("Error. ppFunct
242f0 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e  ionList is NULL.
24300 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
24310 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
24320 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  ;..}...pFunction
24330 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  List = malloc(si
24340 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c  zeof(*pFunctionL
24350 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69  ist));...pFuncti
24360 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e  onList->version.
24370 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  major = ((CACKEY
24380 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
24390 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26  N_CODE) >> 16) &
243a0 20 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f   0xff;..pFunctio
243b0 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d  nList->version.m
243c0 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  inor = ((CACKEY_
243d0 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
243e0 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30  _CODE) >> 8) & 0
243f0 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  xff;...pFunction
24400 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69  List->C_Initiali
24410 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a  ze = C_Initializ
24420 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
24430 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20  t->C_Finalize = 
24440 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75  C_Finalize;..pFu
24450 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
24460 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66  tInfo = C_GetInf
24470 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
24480 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  t->C_GetSlotList
24490 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74   = C_GetSlotList
244a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
244b0 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20  ->C_GetSlotInfo 
244c0 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b  = C_GetSlotInfo;
244d0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
244e0 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20  >C_GetTokenInfo 
244f0 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  = C_GetTokenInfo
24500 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24510 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45  ->C_WaitForSlotE
24520 76 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72  vent = C_WaitFor
24530 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e  SlotEvent;..pFun
24540 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
24550 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20  MechanismList = 
24560 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
24570 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
24580 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69  st->C_GetMechani
24590 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65  smInfo = C_GetMe
245a0 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46  chanismInfo;..pF
245b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
245c0 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69  nitToken = C_Ini
245d0 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69  tToken;..pFuncti
245e0 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49  onList->C_InitPI
245f0 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09  N = C_InitPIN;..
24600 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
24610 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50  _SetPIN = C_SetP
24620 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
24630 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f  st->C_OpenSessio
24640 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f  n = C_OpenSessio
24650 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
24660 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  t->C_CloseSessio
24670 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69  n = C_CloseSessi
24680 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
24690 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  st->C_CloseAllSe
246a0 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65  ssions = C_Close
246b0 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46  AllSessions;..pF
246c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
246d0 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20  etSessionInfo = 
246e0 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
246f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24700 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_GetOperation
24710 53 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65  State = C_GetOpe
24720 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
24730 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
24740 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
24750 20 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f   = C_SetOperatio
24760 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  nState;..pFuncti
24770 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20  onList->C_Login 
24780 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e  = C_Login;..pFun
24790 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67  ctionList->C_Log
247a0 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a  out = C_Logout;.
247b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
247c0 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d  C_CreateObject =
247d0 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b   C_CreateObject;
247e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
247f0 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20  >C_CopyObject = 
24800 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70  C_CopyObject;..p
24810 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
24820 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20  DestroyObject = 
24830 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b  C_DestroyObject;
24840 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
24850 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65  >C_GetObjectSize
24860 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69   = C_GetObjectSi
24870 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
24880 73 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75  st->C_GetAttribu
24890 74 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41  teValue = C_GetA
248a0 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
248b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
248c0 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
248d0 75 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62  ue = C_SetAttrib
248e0 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63  uteValue;..pFunc
248f0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
24900 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f  ObjectsInit = C_
24910 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b  FindObjectsInit;
24920 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
24930 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d  >C_FindObjects =
24940 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a   C_FindObjects;.
24950 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
24960 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
24970 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  al = C_FindObjec
24980 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  tsFinal;..pFunct
24990 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
249a0 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79  ptInit = C_Encry
249b0 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  ptInit;..pFuncti
249c0 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
249d0 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09  t = C_Encrypt;..
249e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
249f0 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  _EncryptUpdate =
24a00 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65   C_EncryptUpdate
24a10 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24a20 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c  ->C_EncryptFinal
24a30 20 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61   = C_EncryptFina
24a40 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
24a50 74 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74  t->C_DecryptInit
24a60 20 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74   = C_DecryptInit
24a70 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24a80 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f  ->C_Decrypt = C_
24a90 44 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74  Decrypt;..pFunct
24aa0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
24ab0 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63  ptUpdate = C_Dec
24ac0 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
24ad0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
24ae0 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44  cryptFinal = C_D
24af0 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46  ecryptFinal;..pF
24b00 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
24b10 69 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69  igestInit = C_Di
24b20 67 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63  gestInit;..pFunc
24b30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
24b40 73 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09  st = C_Digest;..
24b50 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
24b60 5f 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20  _DigestUpdate = 
24b70 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a  C_DigestUpdate;.
24b80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
24b90 43 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f  C_DigestKey = C_
24ba0 44 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e  DigestKey;..pFun
24bb0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
24bc0 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67  estFinal = C_Dig
24bd0 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  estFinal;..pFunc
24be0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
24bf0 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69  Init = C_SignIni
24c00 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
24c10 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69  t->C_Sign = C_Si
24c20 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  gn;..pFunctionLi
24c30 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65  st->C_SignUpdate
24c40 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b   = C_SignUpdate;
24c50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
24c60 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43  >C_SignFinal = C
24c70 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75  _SignFinal;..pFu
24c80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
24c90 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20  gnRecoverInit = 
24ca0 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
24cb0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
24cc0 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  t->C_SignRecover
24cd0 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72   = C_SignRecover
24ce0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24cf0 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d  ->C_VerifyInit =
24d00 20 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09   C_VerifyInit;..
24d10 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
24d20 5f 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69  _Verify = C_Veri
24d30 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fy;..pFunctionLi
24d40 73 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61  st->C_VerifyUpda
24d50 74 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64  te = C_VerifyUpd
24d60 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
24d70 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e  ist->C_VerifyFin
24d80 61 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e  al = C_VerifyFin
24d90 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
24da0 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
24db0 76 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69  verInit = C_Veri
24dc0 66 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09  fyRecoverInit;..
24dd0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
24de0 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d  _VerifyRecover =
24df0 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
24e00 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24e10 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  ->C_DigestEncryp
24e20 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65  tUpdate = C_Dige
24e30 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b  stEncryptUpdate;
24e40 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
24e50 3e 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74  >C_DecryptDigest
24e60 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79  Update = C_Decry
24e70 70 74 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a  ptDigestUpdate;.
24e80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
24e90 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
24ea0 61 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72  ate = C_SignEncr
24eb0 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
24ec0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
24ed0 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65  ryptVerifyUpdate
24ee0 20 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72 69   = C_DecryptVeri
24ef0 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
24f00 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
24f10 72 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65  rateKey = C_Gene
24f20 72 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74  rateKey;..pFunct
24f30 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72  ionList->C_Gener
24f40 61 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47  ateKeyPair = C_G
24f50 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a  enerateKeyPair;.
24f60 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
24f70 43 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72  C_WrapKey = C_Wr
24f80 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
24f90 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b  nList->C_UnwrapK
24fa0 65 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79  ey = C_UnwrapKey
24fb0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24fc0 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20  ->C_DeriveKey = 
24fd0 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46  C_DeriveKey;..pF
24fe0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
24ff0 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65  eedRandom = C_Se
25000 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63  edRandom;..pFunc
25010 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
25020 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47  rateRandom = C_G
25030 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09  enerateRandom;..
25040 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
25050 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
25060 75 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69  us = C_GetFuncti
25070 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63  onStatus;..pFunc
25080 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63  tionList->C_Canc
25090 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43  elFunction = C_C
250a0 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09  ancelFunction;..
250b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
250c0 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74  _GetFunctionList
250d0 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e   = C_GetFunction
250e0 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74  List;...*ppFunct
250f0 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74  ionList = pFunct
25100 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45  ionList;...CACKE
25110 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25120 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
25130 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
25140 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
25150 29 3b 0a 7d 0a 0a                                );.}..