Hex Artifact Content

Artifact b1f39a9840991aeb5ad6b4761d9a6b060a09498e:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 43 53  .#ifdef HAVE_PCS
0040: 43 4c 49 54 45 5f 48 0a 23 20 20 69 6e 63 6c 75  CLITE_H.#  inclu
0050: 64 65 20 3c 70 63 73 63 6c 69 74 65 2e 68 3e 0a  de <pcsclite.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 57 49 4e 53 43 41 52 44 5f 48 0a 23 20  VE_WINSCARD_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 73 63 61   include <winsca
0090: 72 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  rd.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 53 54 44 49 4e 54 5f  def HAVE_STDINT_
00b0: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74  H.#  include <st
00c0: 64 69 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  dint.h>.#endif.#
00d0: 69 66 64 65 66 20 48 41 56 45 5f 49 4e 54 54 59  ifdef HAVE_INTTY
00e0: 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65  PES_H.#  include
00f0: 20 3c 69 6e 74 74 79 70 65 73 2e 68 3e 0a 23 65   <inttypes.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 53 54 44 4c 49 42 5f 48 0a 23 20 20 69 6e 63  _STDLIB_H.#  inc
0120: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0130: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0140: 56 45 5f 55 4e 49 53 54 44 5f 48 0a 23 20 20 69  VE_UNISTD_H.#  i
0150: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0160: 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  >.#endif.#ifdef 
0170: 48 41 56 45 5f 53 54 52 49 4e 47 5f 48 0a 23 20  HAVE_STRING_H.# 
0180: 20 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67   include <string
0190: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
01a0: 66 20 48 41 56 45 5f 50 54 48 52 45 41 44 5f 48  f HAVE_PTHREAD_H
01b0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 74 68  .#  include <pth
01c0: 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  read.h>.#endif.#
01d0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 4d 49 54  ifdef HAVE_LIMIT
01e0: 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  S_H.#  include <
01f0: 6c 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66  limits.h>.#endif
0200: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 5a 4c 49  .#ifdef HAVE_ZLI
0210: 42 5f 48 0a 23 20 20 69 66 64 65 66 20 48 41 56  B_H.#  ifdef HAV
0220: 45 5f 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c  E_LIBZ.#    incl
0230: 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20  ude <zlib.h>.#  
0240: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69  endif.#else.#  i
0250: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23  fdef HAVE_LIBZ.#
0260: 20 20 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c      undef HAVE_L
0270: 49 42 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  IBZ.#  endif.#en
0280: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f  dif..#define CK_
0290: 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b  PTR *.#define CK
02a0: 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
02b0: 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d  (returnType, nam
02c0: 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61  e) returnType na
02d0: 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45  me.#define CK_DE
02e0: 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72  CLARE_FUNCTION(r
02f0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
0300: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65   returnType name
0310: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c  .#define CK_DECL
0320: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49  ARE_FUNCTION_POI
0330: 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c  NTER(returnType,
0340: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0350: 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69  e (* name).#defi
0360: 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46  ne CK_CALLBACK_F
0370: 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79  UNCTION(returnTy
0380: 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e  pe, name) return
0390: 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69  Type (* name).#i
03a0: 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23  fndef NULL_PTR.#
03b0: 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54    define NULL_PT
03c0: 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63  R 0.#endif..#inc
03d0: 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a  lude "pkcs11.h".
03e0: 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78  #include "asn1-x
03f0: 35 30 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20  509.h"..#ifndef 
0400: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0410: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20  VERSION_CODE.#  
0420: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52  define CACKEY_CR
0430: 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
0440: 4f 44 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e  ODE 0x021e00.#en
0450: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41  dif..#ifndef CKA
0460: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
0470: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
0480: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
0490: 54 48 20 30 78 63 65 35 33 36 33 35 38 0a 23 65  TH 0xce536358.#e
04a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
04b0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04c0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
04d0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04e0: 54 48 20 30 78 63 65 35 33 36 33 35 39 0a 23 65  TH 0xce536359.#e
04f0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
0500: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
0510: 49 4e 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b  ING.#  define CK
0520: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
0530: 4e 49 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a  NING 0xce53635a.
0540: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43  #endif.#ifndef C
0550: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
0560: 52 4f 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66  ROTECTION.#  def
0570: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ine CKA_TRUST_EM
0580: 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30  AIL_PROTECTION 0
0590: 78 63 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66  xce53635b.#endif
05a0: 0a 0a 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31  ../* GSC-IS v2.1
05b0: 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a   Definitions */.
05c0: 2f 2a 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a  /** Classes **/.
05d0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c  #define GSCIS_CL
05e0: 41 53 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20  ASS_ISO7816     
05f0: 20 20 20 20 20 20 30 78 30 30 0a 23 64 65 66 69        0x00.#defi
0600: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  ne GSCIS_CLASS_G
0610: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20  LOBAL_PLATFORM  
0620: 20 30 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72   0x80../** Instr
0630: 75 63 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66  uctions **/.#def
0640: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0650: 47 45 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20  GET_RESPONSE    
0660: 20 20 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47    0xC0.#define G
0670: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
0680: 42 49 4e 41 52 59 20 20 20 20 20 20 20 30 78 42  BINARY       0xB
0690: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06a0: 49 4e 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e  INSTR_UPDATE_BIN
06b0: 41 52 59 20 20 20 20 20 30 78 44 36 0a 23 64 65  ARY     0xD6.#de
06c0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
06d0: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
06e0: 20 20 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20     0xA4.#define 
06f0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45  GSCIS_INSTR_EXTE
0700: 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78  RNAL_AUTH     0x
0710: 38 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  82.#define GSCIS
0720: 5f 49 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c  _INSTR_GET_CHALL
0730: 45 4e 47 45 20 20 20 20 20 30 78 38 34 0a 23 64  ENGE     0x84.#d
0740: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0750: 52 5f 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20  R_INTERNAL_AUTH 
0760: 20 20 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65      0x88.#define
0770: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
0780: 49 46 59 20 20 20 20 20 20 20 20 20 20 20 20 30  IFY            0
0790: 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x20.#define GSCI
07a0: 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20  S_INSTR_SIGN    
07b0: 20 20 20 20 20 20 20 20 20 20 30 78 32 41 0a 23            0x2A.#
07c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
07d0: 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20  TR_GET_PROP     
07e0: 20 20 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e       0x56.#defin
07f0: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0800: 54 5f 41 43 52 20 20 20 20 20 20 20 20 20 20 20  T_ACR           
0810: 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43  0x4C.#define GSC
0820: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
0830: 46 46 45 52 20 20 20 20 20 20 20 30 78 35 32 0a  FFER       0x52.
0840: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0850: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20  STR_SIGNDECRYPT 
0860: 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66        0x42..#def
0870: 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f  ine GSCIS_PARAM_
0880: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20  SELECT_APPLET   
0890: 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73    0x04../** Tags
08a0: 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61   **/./*** CCC Ta
08b0: 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  gs ***/.#define 
08c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
08e0: 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  F0.#define GSCIS
08f0: 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20  _TAG_CCC_VER    
0900: 20 20 20 20 20 20 20 20 20 30 78 46 31 0a 23 64           0xF1.#d
0910: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0920: 43 43 47 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCG_VER         
0930: 20 20 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65      0xF2.#define
0940: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
0950: 52 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  RL             0
0960: 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF3.#define GSCI
0970: 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20  S_TAG_PKCS15    
0980: 20 20 20 20 20 20 20 20 20 20 30 78 46 34 0a 23            0xF4.#
0990: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09a0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20  _REG_DATA_MODEL 
09b0: 20 20 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e       0xF5.#defin
09c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
09d0: 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20  TABLE           
09e0: 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF6.#define GSC
09f0: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55  IS_TAG_CARD_APDU
0a00: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 37 0a             0xF7.
0a10: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a20: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20  G_REDIRECTION   
0a30: 20 20 20 20 20 20 30 78 46 41 0a 23 64 65 66 69        0xFA.#defi
0a40: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20  ne GSCIS_TAG_CT 
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53   0xFB.#define GS
0a70: 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20  CIS_TAG_ST      
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 43              0xFC
0a90: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0aa0: 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20  AG_NEXTCCC      
0ab0: 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a         0xFD../**
0ac0: 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32  * General - EF 2
0ad0: 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  200 ***/.#define
0ae0: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45   GSCIS_TAG_FNAME
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0b00: 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x01.#define GSCI
0b10: 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20  S_TAG_MNAME     
0b20: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0a 23            0x02.#
0b30: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b40: 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _LNAME          
0b50: 20 20 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e       0x03.#defin
0b60: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46  e GSCIS_TAG_SUFF
0b70: 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  IX              
0b80: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x04.#define GSC
0b90: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
0ba0: 43 59 20 20 20 20 20 20 20 20 20 30 78 30 35 0a  CY         0x05.
0bb0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0bc0: 47 5f 42 55 52 45 41 55 20 20 20 20 20 20 20 20  G_BUREAU        
0bd0: 20 20 20 20 20 20 30 78 30 36 0a 23 64 65 66 69        0x06.#defi
0be0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0bf0: 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EAU_CODE        
0c00: 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53   0x07.#define GS
0c10: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
0c20: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 30 38  E           0x08
0c30: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c40: 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20  AG_TITLE        
0c50: 20 20 20 20 20 20 20 30 78 30 39 0a 23 64 65 66         0x09.#def
0c60: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ine GSCIS_TAG_BU
0c70: 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20 20 20  ILDING          
0c80: 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47    0x10.#define G
0c90: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
0ca0: 41 44 44 52 31 20 20 20 20 20 20 20 20 30 78 31  ADDR1        0x1
0cb0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
0cc0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32  TAG_OFFICE_ADDR2
0cd0: 20 20 20 20 20 20 20 20 30 78 31 32 0a 23 64 65          0x12.#de
0ce0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0cf0: 46 46 49 43 45 5f 43 49 54 59 20 20 20 20 20 20  FFICE_CITY      
0d00: 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20     0x13.#define 
0d10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d20: 5f 53 54 41 54 45 20 20 20 20 20 20 20 20 30 78  _STATE        0x
0d30: 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  14.#define GSCIS
0d40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20  _TAG_OFFICE_ZIP 
0d50: 20 20 20 20 20 20 20 20 20 30 78 31 35 0a 23 64           0x15.#d
0d60: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0d70: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20  OFFICE_COUNTRY  
0d80: 20 20 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65      0x16.#define
0d90: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0da0: 45 5f 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30  E_PHONE        0
0db0: 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x17.#define GSCI
0dc0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0dd0: 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23  NE_EXT    0x18.#
0de0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0df0: 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20 20 20  _OFFICE_FAX     
0e00: 20 20 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e       0x19.#defin
0e10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e20: 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20  CE_EMAIL        
0e30: 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43  0x1A.#define GSC
0e40: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
0e50: 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31 42 0a  OM         0x1B.
0e60: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0e70: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20  G_NONGOV_AGENCY 
0e80: 20 20 20 20 20 20 30 78 31 43 0a 23 64 65 66 69        0x1C.#defi
0e90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  ne GSCIS_TAG_SSN
0ea0: 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20  _DESIGNATOR     
0eb0: 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20   0x1D../*** PII 
0ec0: 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23  - EF 2100 ***/.#
0ed0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0ee0: 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20 20 20  _SSN            
0ef0: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e       0x20.#defin
0f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20  e GSCIS_TAG_DOB 
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0x21.#define GSC
0f30: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20  IS_TAG_GENDER   
0f40: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 32 0a             0x22.
0f50: 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f  ./*** Login Info
0f60: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30  rmation - EF 400
0f70: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
0f80: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20  SCIS_TAG_USERID 
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34               0x4
0fa0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0fb0: 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20  TAG_DOMAIN      
0fc0: 20 20 20 20 20 20 20 20 30 78 34 31 0a 23 64 65          0x41.#de
0fd0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50  fine GSCIS_TAG_P
0fe0: 41 53 53 57 4f 52 44 20 20 20 20 20 20 20 20 20  ASSWORD         
0ff0: 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61     0x42../*** Ca
1000: 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  rd Information -
1010: 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 5000 ***/.#d
1020: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1030: 49 53 53 55 45 52 49 44 20 20 20 20 20 20 20 20  ISSUERID        
1040: 20 20 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65      0x50.#define
1050: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f   GSCIS_TAG_SERNO
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1070: 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x51.#define GSCI
1080: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
1090: 20 20 20 20 20 20 20 20 20 20 30 78 35 32 0a 23            0x52.#
10a0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10b0: 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 20 20  _EXPIRE_DATE    
10c0: 20 20 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e       0x53.#defin
10d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
10e0: 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20  _TYPE           
10f0: 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x54.#define GSC
1100: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
1110: 43 4f 44 45 20 20 20 20 20 20 20 30 78 35 37 0a  CODE       0x57.
1120: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1130: 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20 20 20  G_CARDID_AID    
1140: 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a        0x58../***
1150: 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e   PKI Information
1160: 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a   - EF 7000 ***/.
1170: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1180: 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 20 20  G_CERTIFICATE   
1190: 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 66 69        0x70.#defi
11a0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  ne GSCIS_TAG_CER
11b0: 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20  T_ISSUE_DATE    
11c0: 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53   0x71.#define GS
11d0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
11e0: 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 37 32  IRE_DATE    0x72
11f0: 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73  ../** Applet IDs
1200: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43   **/.#define GSC
1210: 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20  IS_AID_CCC      
1220: 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 2c             0xA0,
1230: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1240: 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30  1, 0x16, 0xDB, 0
1250: 78 30 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  x00..#ifdef CACK
1260: 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66 64 65  EY_DEBUG.#  ifde
1270: 66 20 48 41 56 45 5f 53 54 44 49 4f 5f 48 0a 23  f HAVE_STDIO_H.#
1280: 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64      include <std
1290: 69 6f 2e 68 3e 0a 23 20 20 65 6e 64 69 66 0a 0a  io.h>.#  endif..
12a0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
12b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
12c0: 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74  ..) { fprintf(st
12d0: 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20  derr, "%s():%i: 
12e0: 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  ", __func__, __L
12f0: 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28  INE__); fprintf(
1300: 73 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72 69  stderr, x); fpri
1310: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
1320: 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43  ); }.#  define C
1330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1340: 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 7b 20  TBUF(f, x, y) { 
1350: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1360: 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65 64 20  MPBUF; unsigned 
1370: 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42 55 46  long idx; TMPBUF
1380: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
1390: 72 20 2a 29 20 28 78 29 3b 20 66 70 72 69 6e 74  r *) (x); fprint
13a0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a  f(stderr, "%s():
13b0: 25 69 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20  %i: %s  (%s/%lu 
13c0: 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63  = {%02x", __func
13d0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c  __, __LINE__, f,
13e0: 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c   #x, (unsigned l
13f0: 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46  ong) (y), TMPBUF
1400: 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d  [0]); for (idx =
1410: 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69   1; idx < (y); i
1420: 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28  dx++) { fprintf(
1430: 73 74 64 65 72 72 2c 20 22 2c 20 25 30 32 78 22  stderr, ", %02x"
1440: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20  , TMPBUF[idx]); 
1450: 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  }; fprintf(stder
1460: 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 7d 0a 23 20  r, "})\n"); }.# 
1470: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
1480: 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b  EBUG_PERROR(x) {
1490: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14a0: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f   "%s():%i: ", __
14b0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
14c0: 29 3b 20 70 65 72 72 6f 72 28 78 29 3b 20 7d 0a  ); perror(x); }.
14d0: 23 20 20 64 65 66 69 6e 65 20 66 72 65 65 28 78  #  define free(x
14e0: 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ) { CACKEY_DEBUG
14f0: 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28 25 70  _PRINTF("FREE(%p
1500: 29 20 28 25 73 29 22 2c 20 78 2c 20 23 78 29 3b  ) (%s)", x, #x);
1510: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1520: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59  tic void *CACKEY
1530: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
1540: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  OC(size_t size, 
1550: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
1560: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
1570: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
1580: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  etval = malloc(s
1590: 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ize);...fprintf(
15a0: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69  stderr, "%s():%i
15b0: 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29  : ", func, line)
15c0: 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
15d0: 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  r, "MALLOC() = %
15e0: 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70  p", retval);..fp
15f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1600: 6e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  n");...return(re
1610: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1620: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
1630: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
1640: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65  (void *ptr, size
1650: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
1660: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
1670: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
1680: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
1690: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69   realloc(ptr, si
16a0: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  ze);...if (retva
16b0: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70  l != ptr) {...fp
16c0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
16d0: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c  s():%i: ", func,
16e0: 20 6c 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e 74   line);...fprint
16f0: 66 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c 4c  f(stderr, "REALL
1700: 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70 74  OC(%p) = %p", pt
1710: 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 70  r, retval);...fp
1720: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1730: 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  n");..}...return
1740: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
1750: 74 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59  tic char *CACKEY
1760: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44  _DEBUG_FUNC_STRD
1770: 55 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  UP(const char *p
1780: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
1790: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
17a0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b  {..char *retval;
17b0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64  ...retval = strd
17c0: 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e  up(ptr);...fprin
17d0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
17e0: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69  :%i: ", func, li
17f0: 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  ne);..fprintf(st
1800: 64 65 72 72 2c 20 22 53 54 52 44 55 50 5f 4d 41  derr, "STRDUP_MA
1810: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
1820: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
1830: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 0a  stderr, "\n");..
1840: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1850: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
1860: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
1870: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
1880: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61  STR(unsigned cha
1890: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68  r tag) {..switch
18a0: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20   (tag) {...case 
18b0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
18c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
18d0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b  IS_TAG_CARDID");
18e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
18f0: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65  G_CCC_VER:....re
1900: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1910: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73  CCC_VER");...cas
1920: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
1930: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
1940: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
1950: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
1960: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
1970: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1980: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09  TAG_CARDURL");..
1990: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
19a0: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72  PKCS15:....retur
19b0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  n("GSCIS_TAG_PKC
19c0: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53  S15");...case GS
19d0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
19e0: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72  _MODEL:....retur
19f0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47  n("GSCIS_TAG_REG
1a00: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09  _DATA_MODEL");..
1a10: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1a20: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65  ACR_TABLE:....re
1a30: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1a40: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63  ACR_TABLE");...c
1a50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
1a60: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75  RD_APDU:....retu
1a70: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
1a80: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73  RD_APDU");...cas
1a90: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  e GSCIS_TAG_REDI
1aa0: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  RECTION:....retu
1ab0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
1ac0: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63  DIRECTION");...c
1ad0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ase GSCIS_TAG_CT
1ae0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1af0: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63  IS_TAG_CT");...c
1b00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ase GSCIS_TAG_ST
1b10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1b20: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63  IS_TAG_ST");...c
1b30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ase GSCIS_TAG_NE
1b40: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e  XTCCC:....return
1b50: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  ("GSCIS_TAG_NEXT
1b60: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53  CCC");...case GS
1b70: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09  CIS_TAG_FNAME:..
1b80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1b90: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_FNAME");...c
1ba0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e  ase GSCIS_TAG_MN
1bb0: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
1bc0: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22  GSCIS_TAG_MNAME"
1bd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1be0: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_LNAME:....re
1bf0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1c00: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  LNAME");...case 
1c10: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
1c20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1c30: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b  IS_TAG_SUFFIX");
1c40: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c50: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09  G_GOVT_AGENCY:..
1c60: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1c70: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22  TAG_GOVT_AGENCY"
1c80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1c90: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72  TAG_BUREAU:....r
1ca0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1cb0: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73  _BUREAU");...cas
1cc0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
1cd0: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  AU_CODE:....retu
1ce0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
1cf0: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63  REAU_CODE");...c
1d00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ase GSCIS_TAG_DE
1d10: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  PT_CODE:....retu
1d20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45  rn("GSCIS_TAG_DE
1d30: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  PT_CODE");...cas
1d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  e GSCIS_TAG_TITL
1d50: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1d60: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b  CIS_TAG_TITLE");
1d70: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d80: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72  G_BUILDING:....r
1d90: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1da0: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63  _BUILDING");...c
1db0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
1dc0: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72  FICE_ADDR1:....r
1dd0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1de0: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b  _OFFICE_ADDR1");
1df0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1e00: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a  G_OFFICE_ADDR2:.
1e10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e20: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
1e30: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  2");...case GSCI
1e40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
1e50: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
1e60: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
1e70: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ITY");...case GS
1e80: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
1e90: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TATE:....return(
1ea0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1eb0: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73  E_STATE");...cas
1ec0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1ed0: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72  CE_ZIP:....retur
1ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
1ef0: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73  ICE_ZIP");...cas
1f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1f10: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72  CE_COUNTRY:....r
1f20: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1f30: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22  _OFFICE_COUNTRY"
1f40: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1f50: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
1f60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1f70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
1f80: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ONE");...case GS
1f90: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
1fa0: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74  HONE_EXT:....ret
1fb0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1fc0: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22  FFICE_PHONE_EXT"
1fd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1fe0: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a  TAG_OFFICE_FAX:.
1ff0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2000: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22  _TAG_OFFICE_FAX"
2010: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2020: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2030: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2040: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
2050: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIL");...case GS
2060: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2070: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OOM:....return("
2080: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2090: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20  _ROOM");...case 
20a0: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
20b0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
20c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f  rn("GSCIS_TAG_NO
20d0: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09  NGOV_AGENCY");..
20e0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
20f0: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a  SSN_DESIGNATOR:.
2100: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2110: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2120: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TOR");...case GS
2130: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09  CIS_TAG_SSN:....
2140: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2150: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20  G_SSN");...case 
2160: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09  GSCIS_TAG_DOB:..
2170: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2180: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73  TAG_DOB");...cas
2190: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  e GSCIS_TAG_GEND
21a0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
21b0: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22  SCIS_TAG_GENDER"
21c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
21d0: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72  TAG_USERID:....r
21e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
21f0: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73  _USERID");...cas
2200: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  e GSCIS_TAG_DOMA
2210: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IN:....return("G
2220: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22  SCIS_TAG_DOMAIN"
2230: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2240: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09  TAG_PASSWORD:...
2250: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2260: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09  AG_PASSWORD");..
2270: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2280: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74  ISSUERID:....ret
2290: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
22a0: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73  SSUERID");...cas
22b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
22c0: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  O:....return("GS
22d0: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b  CIS_TAG_SERNO");
22e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
22f0: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  G_ISSUE_DATE:...
2300: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2310: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  AG_ISSUE_DATE");
2320: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2330: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  G_EXPIRE_DATE:..
2340: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2350: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22  TAG_EXPIRE_DATE"
2360: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2370: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09  TAG_CARD_TYPE:..
2380: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2390: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b  TAG_CARD_TYPE");
23a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
23b0: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a  G_SECURITY_CODE:
23c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
23d0: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
23e0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
23f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
2400: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2410: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
2420: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AID");...case GS
2430: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
2440: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2450: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
2460: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  ICATE");...case 
2470: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
2480: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
2490: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
24a0: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22  CERT_ISSUE_DATE"
24b0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
24c0: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
24d0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
24e0: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
24f0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
2500: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
2510: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
2520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
2530: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
2540: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c  CARDERR_TO_STR(L
2550: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09  ONG retcode) {..
2560: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29  switch (retcode)
2570: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
2580: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65  S_SUCCESS:....re
2590: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55  turn("SCARD_S_SU
25a0: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CCESS");...case 
25b0: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45  SCARD_E_CANCELLE
25c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
25d0: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22  ARD_E_CANCELLED"
25e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
25f0: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a  E_CANT_DISPOSE:.
2600: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2610: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22  _E_CANT_DISPOSE"
2620: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2630: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
2640: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UFFER:....return
2650: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  ("SCARD_E_INSUFF
2660: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b  ICIENT_BUFFER");
2670: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2680: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09  INVALID_ATR:....
2690: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
26a0: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09  INVALID_ATR");..
26b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
26c0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09  VALID_HANDLE:...
26d0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
26e0: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22  _INVALID_HANDLE"
26f0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2700: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
2710: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TER:....return("
2720: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2730: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63  PARAMETER");...c
2740: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
2750: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72  LID_TARGET:....r
2760: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
2770: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b  NVALID_TARGET");
2780: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2790: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09  INVALID_VALUE:..
27a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
27b0: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22  E_INVALID_VALUE"
27c0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
27d0: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09  E_NO_MEMORY:....
27e0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
27f0: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63  NO_MEMORY");...c
2800: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
2810: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  OWN_READER:....r
2820: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
2830: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b  NKNOWN_READER");
2840: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2850: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75  TIMEOUT:....retu
2860: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45  rn("SCARD_E_TIME
2870: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OUT");...case SC
2880: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
2890: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  OLATION:....retu
28a0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52  rn("SCARD_E_SHAR
28b0: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b  ING_VIOLATION");
28c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
28d0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09  NO_SMARTCARD:...
28e0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
28f0: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b  _NO_SMARTCARD");
2900: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2910: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09  UNKNOWN_CARD:...
2920: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2930: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b  _UNKNOWN_CARD");
2940: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2950: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a  PROTO_MISMATCH:.
2960: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2970: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
2980: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  H");...case SCAR
2990: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09  D_E_NOT_READY:..
29a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
29b0: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09  E_NOT_READY");..
29c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59  .case SCARD_E_SY
29d0: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  STEM_CANCELLED:.
29e0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
29f0: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
2a00: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
2a10: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
2a20: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CTED:....return(
2a30: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41  "SCARD_E_NOT_TRA
2a40: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73  NSACTED");...cas
2a50: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
2a60: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  _UNAVAILABLE:...
2a70: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2a80: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
2a90: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  BLE");...case SC
2aa0: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
2ab0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
2ac0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  n("SCARD_W_UNSUP
2ad0: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  PORTED_CARD");..
2ae0: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
2af0: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a  RESPONSIVE_CARD:
2b00: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2b10: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45  D_W_UNRESPONSIVE
2b20: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2b30: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
2b40: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
2b50: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  n("SCARD_W_UNPOW
2b60: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  ERED_CARD");...c
2b70: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45  ase SCARD_W_RESE
2b80: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  T_CARD:....retur
2b90: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54  n("SCARD_W_RESET
2ba0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2bb0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
2bc0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
2bd0: 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44  "SCARD_W_REMOVED
2be0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2bf0: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
2c00: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e  SMALL:....return
2c10: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f  ("SCARD_E_PCI_TO
2c20: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73  O_SMALL");...cas
2c30: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
2c40: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
2c50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2c60: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
2c70: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
2c80: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
2c90: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
2ca0: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  n("SCARD_E_DUPLI
2cb0: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09  CATE_READER");..
2cc0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
2cd0: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a  RD_UNSUPPORTED:.
2ce0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2cf0: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
2d00: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
2d10: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
2d20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2d30: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22  RD_E_NO_SERVICE"
2d40: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2d50: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
2d60: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
2d70: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
2d80: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20  OPPED");...case 
2d90: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44  SCARD_W_INSERTED
2da0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
2db0: 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  ("SCARD_W_INSERT
2dc0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
2dd0: 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50  e SCARD_E_UNSUPP
2de0: 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09  ORTED_FEATURE:..
2df0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2e00: 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45  E_UNSUPPORTED_FE
2e10: 41 54 55 52 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  ATURE");..}...re
2e20: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
2e30: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
2e40: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
2e50: 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
2e60: 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f  O_STR(uint16_t o
2e70: 62 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20  bjid) {..switch 
2e80: 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65  (objid) {...case
2e90: 20 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75   0x2000:....retu
2ea0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
2eb0: 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f  BJID_GENERALINFO
2ec0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30  ");...case 0x210
2ed0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
2ee0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50  CKEY_TLV_OBJID_P
2ef0: 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29  ROPERSONALINFO")
2f00: 3b 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a  ;...case 0x3000:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2f20: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43  EY_TLV_OBJID_ACC
2f30: 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09  ESSCONTROL");...
2f40: 63 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09  case 0x4000:....
2f50: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
2f60: 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29  LV_OBJID_LOGIN")
2f70: 3b 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a  ;...case 0x5000:
2f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2f90: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52  EY_TLV_OBJID_CAR
2fa0: 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20  DINFO");...case 
2fb0: 30 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x6000:....retur
2fc0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2fd0: 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29  JID_BIOMETRICS")
2fe0: 3b 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a  ;...case 0x7000:
2ff0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3000: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47  EY_TLV_OBJID_DIG
3010: 49 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09  ITALSIGCERT");..
3020: 09 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09  .case 0x0200:...
3030: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3040: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
3050: 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30  RSON");...case 0
3060: 78 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e  x0202:....return
3070: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3080: 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22  ID_CAC_BENEFITS"
3090: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33  );...case 0x0203
30a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30b0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
30c0: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22  C_OTHERBENEFITS"
30d0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31  );...case 0x0201
30e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30f0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3100: 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09  C_PERSONNEL");..
3110: 09 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09  .case 0x02FE:...
3120: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3130: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
3140: 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72  ICERT");..}....r
3150: 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29  eturn("UNKNOWN")
3160: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
3170: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
3180: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
3190: 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74  E_TO_STR(uint8_t
31a0: 20 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69   apptype) {..swi
31b0: 74 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a  tch (apptype) {.
31c0: 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09  ..case 0x00:....
31d0: 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a  return("NONE");.
31e0: 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09  ..case 0x01:....
31f0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3200: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29  LV_APP_GENERIC")
3210: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09  ;...case 0x02:..
3220: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3230: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
3240: 09 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09  ..case 0x03:....
3250: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3260: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
3270: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3280: 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SKI");...case 0x
3290: 30 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  04:....return("C
32a0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
32b0: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35  I");...case 0x05
32c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
32d0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45  KEY_TLV_APP_GENE
32e0: 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  RIC | CACKEY_TLV
32f0: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
3300: 73 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75  se 0x06:....retu
3310: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
3320: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f  PP_SKI | CACKEY_
3330: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
3340: 09 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72  .case 0x07:....r
3350: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3360: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3370: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3380: 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  KI | CACKEY_TLV_
3390: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09  APP_PKI");..}...
33a0: 72 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22  return("INVALID"
33b0: 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20  );.}..#  define 
33c0: 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b 45 59  malloc(x) CACKEY
33d0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
33e0: 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  OC(x, __func__, 
33f0: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66  __LINE__).#  def
3400: 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79  ine realloc(x, y
3410: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
3420: 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79  UNC_REALLOC(x, y
3430: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
3440: 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66 20 73  NE__).#  ifdef s
3450: 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64 65 66  trdup.#    undef
3460: 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64 69 66   strdup.#  endif
3470: 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75  .#  define strdu
3480: 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  p(x) CACKEY_DEBU
3490: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 78 2c  G_FUNC_STRDUP(x,
34a0: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
34b0: 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20 64 65  E__).#else.#  de
34c0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
34d0: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f  G_PRINTF(x...) /
34e0: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41  **/.#  define CA
34f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
3500: 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a  BUF(f, x, y) /**
3510: 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  /.#  define CACK
3520: 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28  EY_DEBUG_PERROR(
3530: 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  x) /**/.#  defin
3540: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
3550: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78  UNC_TAG_TO_STR(x
3560: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
3570: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
3580: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
3590: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78  CARDERR_TO_STR(x
35a0: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
35b0: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
35c0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
35d0: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22  BJID_TO_STR(x) "
35e0: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
35f0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
3600: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
3610: 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  YPE_TO_STR(x) "D
3620: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
3630: 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 63 61  endif..struct ca
3640: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
3650: 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ty {..unsigned c
3660: 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a 09  har applet[7];..
3670: 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a 0a  uint16_t file;..
3680: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
3690: 6c 61 62 65 6c 3b 0a 0a 09 73 69 7a 65 5f 74 20  label;...size_t 
36a0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
36b0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
36c0: 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09  *certificate;...
36d0: 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b  ssize_t keysize;
36e0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  .};..struct cack
36f0: 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 73  ey_identity {..s
3700: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
3710: 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
3720: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f  _identity;...CK_
3730: 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69  ATTRIBUTE *attri
3740: 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  butes;..CK_ULONG
3750: 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e   attributes_coun
3760: 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  t;.};..struct ca
3770: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09  ckey_session {..
3780: 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b  int active;...CK
3790: 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
37a0: 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74  ...CK_STATE stat
37b0: 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61  e;..CK_FLAGS fla
37c0: 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  gs;..CK_ULONG ul
37d0: 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b  DeviceError;..CK
37e0: 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
37f0: 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49  cation;..CK_NOTI
3800: 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72  FY Notify;...str
3810: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
3820: 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b  ity *identities;
3830: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3840: 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
3850: 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61  ;...int search_a
3860: 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49  ctive;..CK_ATTRI
3870: 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f  BUTE_PTR search_
3880: 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  query;..CK_ULONG
3890: 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f   search_query_co
38a0: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  unt;..unsigned l
38b0: 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f  ong search_curr_
38c0: 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61  id;...int sign_a
38d0: 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41  ctive;..CK_MECHA
38e0: 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d  NISM_TYPE sign_m
38f0: 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59  echanism;..CK_BY
3900: 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b  TE_PTR sign_buf;
3910: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3920: 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e  sign_buflen;..un
3930: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e  signed long sign
3940: 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63  _bufused;..struc
3950: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
3960: 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  y *sign_identity
3970: 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f  ;...int decrypt_
3980: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48  active;..CK_MECH
3990: 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79  ANISM_TYPE decry
39a0: 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43  pt_mechanism;..C
39b0: 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79  K_VOID_PTR decry
39c0: 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43  pt_mech_parm;..C
39d0: 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f  K_ULONG decrypt_
39e0: 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73  mech_parmlen;..s
39f0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
3a00: 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69  ntity *decrypt_i
3a10: 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72  dentity;.};..str
3a20: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
3a30: 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a  {..int active;..
3a40: 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64  .char *pcsc_read
3a50: 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63  er;...int pcsc_c
3a60: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09  ard_connected;..
3a70: 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63  SCARDHANDLE pcsc
3a80: 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61  _card;...int tra
3a90: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a  nsaction_depth;.
3aa0: 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74  ..int slot_reset
3ab0: 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ;.};..typedef en
3ac0: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56  um {..CACKEY_TLV
3ad0: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30  _APP_GENERIC = 0
3ae0: 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x01,..CACKEY_TLV
3af0: 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30  _APP_SKI     = 0
3b00: 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x02,..CACKEY_TLV
3b10: 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30  _APP_PKI     = 0
3b20: 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76  x04.} cackey_tlv
3b30: 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64  _apptype;..typed
3b40: 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45  ef enum {..CACKE
3b50: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45  Y_TLV_OBJID_GENE
3b60: 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20  RALINFO       = 
3b70: 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x2000,..CACKEY_
3b80: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
3b90: 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78  SONALINFO   = 0x
3ba0: 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  2100,..CACKEY_TL
3bb0: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
3bc0: 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30  NTROL     = 0x30
3bd0: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
3be0: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20  OBJID_LOGIN     
3bf0: 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30          = 0x4000
3c00: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
3c10: 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20  JID_CARDINFO    
3c20: 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a        = 0x5000,.
3c30: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
3c40: 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20  D_BIOMETRICS    
3c50: 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43      = 0x6000,..C
3c60: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3c70: 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20  DIGITALSIGCERT  
3c80: 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43    = 0x7000,..CAC
3c90: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3ca0: 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20  C_PERSON        
3cb0: 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45  = 0x0200,..CACKE
3cc0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3cd0: 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20  BENEFITS      = 
3ce0: 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f  0x0202,..CACKEY_
3cf0: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54  TLV_OBJID_CAC_OT
3d00: 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78  HERBENEFITS = 0x
3d10: 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0203,..CACKEY_TL
3d20: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
3d30: 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32  ONNEL     = 0x02
3d40: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
3d50: 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52  OBJID_CAC_PKICER
3d60: 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45  T       = 0x02FE
3d70: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  .} cackey_tlv_ob
3d80: 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66  jectid;..typedef
3d90: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
3da0: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
3db0: 45 4e 54 20 20 20 20 3d 20 32 2c 0a 09 43 41 43  ENT    = 2,..CAC
3dc0: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
3dd0: 41 42 53 45 4e 54 20 20 20 20 20 3d 20 31 2c 0a  ABSENT     = 1,.
3de0: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  .CACKEY_PCSC_S_O
3df0: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  K              =
3e00: 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   0,..CACKEY_PCSC
3e10: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
3e20: 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59     = -1,..CACKEY
3e30: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20  _PCSC_E_BADPIN  
3e40: 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43          = -2,..C
3e50: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
3e60: 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d  KED          = -
3e70: 33 2c 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b  3,.} cackey_ret;
3e80: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
3e90: 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75  tlv_cardurl {..u
3ea0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20  nsigned char    
3eb0: 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63      rid[5];..cac
3ec0: 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20  key_tlv_apptype 
3ed0: 20 20 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b    apptype;..cack
3ee0: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20  ey_tlv_objectid 
3ef0: 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b   objectid;..cack
3f00: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20  ey_tlv_objectid 
3f10: 20 61 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65   appid;..unsigne
3f20: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 70 69  d char        pi
3f30: 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  nid;.};..struct 
3f40: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
3f50: 79 3b 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  y;.struct cackey
3f60: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75  _tlv_entity {..u
3f70: 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a  int8_t tag;..siz
3f80: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e  e_t length;...un
3f90: 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61  ion {...void *va
3fa0: 6c 75 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61  lue;...struct ca
3fb0: 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c  ckey_tlv_cardurl
3fc0: 20 2a 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b   *value_cardurl;
3fd0: 0a 09 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65  ...uint8_t value
3fe0: 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72  _byte;..};...str
3ff0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
4000: 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b  ntity *_next;.};
4010: 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62  ../* CACKEY Glob
4020: 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74  al Handles */.st
4030: 61 74 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65  atic void *cacke
4040: 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c  y_biglock = NULL
4050: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
4060: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63  cackey_session c
4070: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31  ackey_sessions[1
4080: 32 38 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75  28];.static stru
4090: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63  ct cackey_slot c
40a0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d  ackey_slots[128]
40b0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ;.static int cac
40c0: 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
40d0: 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  = 0;.static int 
40e0: 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69  cackey_biglock_i
40f0: 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e  nit = 0;.CK_C_IN
4100: 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61  ITIALIZE_ARGS ca
4110: 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50  ckey_args;../* P
4120: 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c  CSC Global Handl
4130: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53  es */.static LPS
4140: 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b  CARDCONTEXT cack
4150: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
4160: 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75   NULL;..static u
4170: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63  nsigned long cac
4180: 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76  key_getversion(v
4190: 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75  oid) {..static u
41a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74  nsigned long ret
41b0: 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69  val = 255;..unsi
41c0: 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20  gned long major 
41d0: 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  = 0;..unsigned l
41e0: 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09  ong minor = 0;..
41f0: 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20  char *major_str 
4200: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d  = NULL;..char *m
4210: 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b  inor_str = NULL;
4220: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4230: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
4240: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  );...if (retval 
4250: 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b  != 255) {...CACK
4260: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4270: 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78  "Returning 0x%lx
4280: 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74   (cached).", ret
4290: 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  val);....return(
42a0: 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65  retval);..}...re
42b0: 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65  tval = 0;..#ifde
42c0: 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  f PACKAGE_VERSIO
42d0: 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f  N.        major_
42e0: 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45  str = PACKAGE_VE
42f0: 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f  RSION;..if (majo
4300: 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20  r_str) {..      
4310: 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75    major = strtou
4320: 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69  l(major_str, &mi
4330: 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09  nor_str, 10);...
4340: 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20  .if (minor_str) 
4350: 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72  {....minor = str
4360: 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b  toul(minor_str +
4370: 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09   1, NULL, 10);..
4380: 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d  .}..}...retval =
4390: 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c   (major << 16) |
43a0: 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23   (minor << 8);.#
43b0: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
43c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
43d0: 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72  urning 0x%lx", r
43e0: 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
43f0: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20  (retval);.}../* 
4400: 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75  PC/SC Related Fu
4410: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a  nctions */./*. *
4420: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
4430: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f   void cackey_slo
4440: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
4450: 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  l(void);. *. * A
4460: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
4470: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
4480: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
4490: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
44a0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
44b0: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
44c0: 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e   from all cards.
44d0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
44e0: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  oid cackey_slots
44f0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
4500: 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f  void) {..uint32_
4510: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
4520: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
4530: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28  lled.");...for (
4540: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
4550: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
4560: 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
4570: 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
4580: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
4590: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
45a0: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
45b0: 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b  ected) {....CACK
45c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
45d0: 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  "SCardDisconnect
45e0: 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28  (%lu) called", (
45f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
4600: 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  dx);.....SCardDi
4610: 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f  sconnect(cackey_
4620: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
4630: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
4640: 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09  E_CARD);...}....
4650: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
4660: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
4670: 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61 63  ected = 0;...cac
4680: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
4690: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
46a0: 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63   = 0;....if (cac
46b0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
46c0: 63 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b  ctive) {....CACK
46d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
46e0: 22 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20  "Marking active 
46f0: 73 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e  slot %lu as bein
4700: 67 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67  g reset", (unsig
4710: 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a  ned long) idx);.
4720: 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ..}....cackey_sl
4730: 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65  ots[idx].slot_re
4740: 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41  set = 1;..}...CA
4750: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4760: 46 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a  F("Returning");.
4770: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
4780: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
4790: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
47a0: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
47b0: 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  t(void);. *. * A
47c0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
47d0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
47e0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
47f0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
4800: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
4810: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
4820: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
4830: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
4840: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
4850: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
4860: 6e 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f  nects to the PC/
4870: 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61  SC Connection Ma
4880: 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65  nager and update
4890: 73 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f  s the. *     glo
48a0: 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20  bal handle.. *. 
48b0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
48c0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
48d0: 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  _connect(void) {
48e0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74  ..LONG scard_est
48f0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69  _context_ret;.#i
4900: 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49  fdef HAVE_SCARDI
4910: 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c  SVALIDCONTEXT..L
4920: 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69  ONG scard_isvali
4930: 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09  d_ret;.#endif...
4940: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4950: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
4960: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
4970: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
4980: 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73  ) {...cackey_pcs
4990: 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f  c_handle = mallo
49a0: 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  c(sizeof(*cackey
49b0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a  _pcsc_handle));.
49c0: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
49d0: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
49e0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
49f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
4a00: 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   to malloc() fai
4a10: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
4a20: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
4a30: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
4a40: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
4a50: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
4a60: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
4a70: 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
4a80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
4a90: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
4aa0: 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b  text() called");
4ab0: 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  ...scard_est_con
4ac0: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64  text_ret = SCard
4ad0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
4ae0: 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53  (SCARD_SCOPE_SYS
4af0: 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  TEM, NULL, NULL,
4b00: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
4b10: 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72  dle);...if (scar
4b20: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4b30: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
4b40: 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45  CESS) {....CACKE
4b50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4b60: 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74  Call to SCardEst
4b70: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61  ablishContext fa
4b80: 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25  iled (returned %
4b90: 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e  s/%li), returnin
4ba0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43  g in failure", C
4bb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4bc0: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
4bd0: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
4be0: 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  xt_ret), (long) 
4bf0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
4c00: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65  t_ret);.....free
4c10: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
4c20: 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  dle);....cackey_
4c30: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
4c40: 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  LL;.....cackey_s
4c50: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
4c60: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
4c70: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
4c80: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d  GENERIC);...}..}
4c90: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43  ..#ifdef HAVE_SC
4ca0: 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58  ARDISVALIDCONTEX
4cb0: 54 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  T..CACKEY_DEBUG_
4cc0: 50 52 49 4e 54 46 28 22 53 43 61 72 64 49 73 56  PRINTF("SCardIsV
4cd0: 61 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61  alidContext() ca
4ce0: 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69  lled");..scard_i
4cf0: 73 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61  svalid_ret = SCa
4d00: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
4d10: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
4d20: 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72  ndle);..if (scar
4d30: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d  d_isvalid_ret !=
4d40: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
4d50: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
4d60: 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c  UG_PRINTF("Handl
4d70: 65 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76  e has become inv
4d80: 61 6c 69 64 20 28 53 43 61 72 64 49 73 56 61 6c  alid (SCardIsVal
4d90: 69 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25  idContext = %s/%
4da0: 6c 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72  li), trying to r
4db0: 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c  e-establish...",
4dc0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4dd0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
4de0: 54 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64  TR(scard_isvalid
4df0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
4e00: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29  ard_isvalid_ret)
4e10: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
4e20: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45  G_PRINTF("SCardE
4e30: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
4e40: 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63  ) called");...sc
4e50: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
4e60: 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62  ret = SCardEstab
4e70: 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52  lishContext(SCAR
4e80: 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20  D_SCOPE_SYSTEM, 
4e90: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b  NULL, NULL, cack
4ea0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
4eb0: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74  ...if (scard_est
4ec0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
4ed0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
4ee0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
4ef0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
4f00: 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73  to SCardEstablis
4f10: 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20  hContext failed 
4f20: 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69  (returned %s/%li
4f30: 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  ), returning in 
4f40: 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59  failure", CACKEY
4f50: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
4f60: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
4f70: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4f80: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
4f90: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4fa0: 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b  );.....free(cack
4fb0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
4fc0: 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
4fd0: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  handle = NULL;..
4fe0: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
4ff0: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
5000: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
5010: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5020: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  IC);...}....CACK
5030: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5040: 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e  "Handle has been
5050: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22   re-established"
5060: 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43  );..}.#endif...C
5070: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5080: 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20  TF("Sucessfully 
5090: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f  connected to PC/
50a0: 53 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  SC, returning in
50b0: 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65   success");...re
50c0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
50d0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
50e0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
50f0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5100: 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
5110: 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20  ct(void);. *. * 
5120: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
5130: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
5140: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
5150: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
5160: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
5170: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
5180: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5190: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
51a0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
51b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69  This function di
51c0: 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74  sconnects from t
51d0: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74  he PC/SC Connect
51e0: 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20  ion manager and 
51f0: 75 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74  updates. *     t
5200: 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65  he global handle
5210: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
5220: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
5230: 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
5240: 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20  t(void) {..LONG 
5250: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
5260: 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_ret;...CACKEY_
5270: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
5280: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
5290: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
52a0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  e == NULL) {...r
52b0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
52c0: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63  C_S_OK);..}...sc
52d0: 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f  ard_rel_context_
52e0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61  ret = SCardRelea
52f0: 73 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65  seContext(*cacke
5300: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
5310: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
5320: 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72  c_handle) {...fr
5330: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
5340: 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b  andle);.....cack
5350: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
5360: 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28   NULL;..}...if (
5370: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
5380: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
5390: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65  _SUCCESS) {...re
53a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
53b0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
53c0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
53d0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
53e0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
53f0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
5400: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
5410: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
5420: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
5430: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5440: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
5450: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
5460: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
5470: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
5480: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5490: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
54a0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
54b0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
54c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
54d0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
54e0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
54f0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
5500: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
5510: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  ret cackey_conne
5520: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
5530: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
5540: 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ) {..cackey_ret 
5550: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
5560: 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ;..DWORD protoco
5570: 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63  l;..LONG scard_c
5580: 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  onn_ret;...CACKE
5590: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
55a0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
55b0: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
55c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
55d0: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
55e0: 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69  ecified, returni
55f0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
5600: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
5610: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5620: 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
5630: 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
5640: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
5650: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
5660: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
5670: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
5680: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5690: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
56a0: 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
56b0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
56c0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
56d0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
56e0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
56f0: 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72  ./* Connect to r
5700: 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 64  eader, if needed
5710: 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e   */..if (!slot->
5720: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
5730: 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ted) {...CACKEY_
5740: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
5750: 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 63  ardConnect(%s) c
5760: 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63  alled", slot->pc
5770: 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73 63  sc_reader);...sc
5780: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
5790: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
57a0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
57b0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
57c0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
57d0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
57e0: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74  OTOCOL_T0, &slot
57f0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
5800: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28  otocol);....if (
5810: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21  scard_conn_ret !
5820: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
5830: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
5840: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
5850: 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20  nection to card 
5860: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
5870: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43  g in failure (SC
5880: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25  ardConnect() = %
5890: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
58a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
58b0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
58c0: 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e  _conn_ret), (lon
58d0: 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  g) scard_conn_re
58e0: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
58f0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5900: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c  ERIC);...}....sl
5910: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
5920: 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73  nnected = 1;...s
5930: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
5940: 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a  _depth = 0;..}..
5950: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5960: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
5970: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
5980: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
5990: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
59a0: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
59b0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
59c0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
59d0: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
59e0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
59f0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
5a00: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
5a10: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
5a20: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
5a30: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
5a40: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
5a50: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
5a60: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
5a70: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
5a80: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72  ES. *     The tr
5a90: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  ansaction should
5aa0: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75   be terminated u
5ab0: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64  sing "cackey_end
5ac0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a  _transaction". *
5ad0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
5ae0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
5af0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
5b00: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5b10: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
5b20: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
5b30: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73  onn_ret;..LONG s
5b40: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a  card_trans_ret;.
5b50: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5b60: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
5b70: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ;...cackey_conn_
5b80: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
5b90: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
5ba0: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e  ..if (cackey_con
5bb0: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
5bc0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
5bd0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5be0: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
5bf0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
5c00: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
5c10: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
5c20: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5c30: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
5c40: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
5c50: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth++;...if (slo
5c60: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
5c70: 65 70 74 68 20 3e 20 31 29 20 7b 0a 09 09 43 41  epth > 1) {...CA
5c80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5c90: 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20  F("Already in a 
5ca0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72  transaction, per
5cb0: 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f  forming no actio
5cc0: 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25  n (new depth = %
5cd0: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73  i)", slot->trans
5ce0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a  action_depth);..
5cf0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5d00: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
5d10: 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  .scard_trans_ret
5d20: 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72 61   = SCardBeginTra
5d30: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70  nsaction(slot->p
5d40: 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20 28  csc_card);..if (
5d50: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
5d60: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
5d70: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
5d80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
5d90: 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72 61  ble to begin tra
5da0: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
5db0: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a  ing in error");.
5dc0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5dd0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
5de0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
5df0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65  BUG_PRINTF("Suce
5e00: 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74 72  ssfully began tr
5e10: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f  ansaction on slo
5e20: 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70  t (%s)", slot->p
5e30: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72  csc_reader);...r
5e40: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5e50: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
5e60: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
5e70: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
5e80: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
5e90: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
5ea0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
5eb0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5ec0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
5ed0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
5ee0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
5ef0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
5f00: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5f10: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
5f20: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
5f30: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
5f40: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
5f50: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
5f60: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
5f70: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
5f80: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63 61  ion requires "ca
5f90: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
5fa0: 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63 61  action" to be ca
5fb0: 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a  lled first. *. *
5fc0: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
5fd0: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ret cackey_end_t
5fe0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
5ff0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
6000: 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  lot) {..LONG sca
6010: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09  rd_trans_ret;...
6020: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6030: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
6040: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
6050: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
6060: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
6070: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
6080: 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64  is not connected
6090: 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  , unable to end 
60a0: 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 0a  transaction");..
60b0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
60c0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
60d0: 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
60e0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
60f0: 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  h == 0) {...CACK
6100: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6110: 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74  "Terminating a t
6120: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
6130: 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29  has not begun!")
6140: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
6150: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6160: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
6170: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
6180: 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  --;...if (slot->
6190: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
61a0: 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45  h > 0) {...CACKE
61b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
61c0: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
61d0: 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  ll in progress, 
61e0: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  not terminating 
61f0: 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74  on-card Transact
6200: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
6210: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
6220: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
6230: 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  th);....return(C
6240: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6250: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  ERIC);..}...scar
6260: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
6270: 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  ardEndTransactio
6280: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
6290: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
62a0: 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ARD);..if (scard
62b0: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
62c0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
62d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
62e0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
62f0: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
6300: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
6310: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
6320: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6330: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
6340: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6350: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
6360: 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e   terminated tran
6370: 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20  saction on slot 
6380: 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73  (%s)", slot->pcs
6390: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74  c_reader);...ret
63a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
63b0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44  S_OK);.}../* APD
63c0: 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  U Related Functi
63d0: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
63e0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
63f0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
6400: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
6410: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
6420: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
6430: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
6440: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
6450: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
6460: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
6470: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
6480: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
6490: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
64a0: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
64b0: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
64c0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
64d0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
64e0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
64f0: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
6500: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
6510: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
6520: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
6530: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
6540: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
6550: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20  ned char class. 
6560: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43  *         APDU C
6570: 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53  lass (GSCIS_CLAS
6580: 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43  S_ISO7816 or GSC
6590: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
65a0: 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20  PLATFORM. *     
65b0: 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43      usually), (C
65c0: 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  LA). *. *     un
65d0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
65e0: 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20  ruction. *      
65f0: 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74     APDU Instruct
6600: 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20  ion (INS). *. * 
6610: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
6620: 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20  r p1. *         
6630: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31  APDU Parameter 1
6640: 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20   (P1). *. *     
6650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32  unsigned char p2
6660: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
6670: 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32   Parameter 2 (P2
6680: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
6690: 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20  gned char lc. * 
66a0: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e          APDU Len
66b0: 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28  gth of Content (
66c0: 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Lc) -- this is t
66d0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61  he length of "da
66e0: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70  ta". *         p
66f0: 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64  arameter.  If "d
6700: 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65  ata" is specifie
6710: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
6720: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20  parameter will. 
6730: 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e  *         be ign
6740: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
6750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
6760: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50  ata. *         P
6770: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
6780: 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68   to send.  It sh
6790: 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74  ould be "Lc" byt
67a0: 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20  es long.  If. * 
67b0: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
67c0: 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20  d as NULL, "Lc" 
67d0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74  will not be sent
67e0: 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65  , and this buffe
67f0: 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20  r will be. *    
6800: 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a       ignored.. *
6810: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
6820: 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20   char le. *     
6830: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
6840: 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28  of Expectation (
6850: 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Le) -- this is t
6860: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
6870: 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65  . *         expe
6880: 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20  cted reply.  If 
6890: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65  this is specifie
68a0: 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77  d as 0 then it w
68b0: 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20  ill not. *      
68c0: 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20     be sent.. *. 
68d0: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a  *     uint16_t *
68e0: 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20  respcode. *     
68f0: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65      [OUT] Pointe
6900: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20  r to storage of 
6910: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f  APDU response co
6920: 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a  de.  If this is.
6930: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
6940: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
6950: 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20  e response code 
6960: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
6970: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
6980: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
6990: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
69a0: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
69b0: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
69c0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20   response data. 
69d0: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
69e0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
69f0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
6a00: 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c  sponse data will
6a10: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20   be discarded.  
6a20: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68  If. *         th
6a30: 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22  e "respdata_len"
6a40: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70   parameter is sp
6a50: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
6a60: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20   this buffer. * 
6a70: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74          will not
6a80: 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a   be updated.. *.
6a90: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72   *     size_t *r
6aa0: 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20  espdata_len. *  
6ab0: 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d         [IN, OUT]
6ac0: 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c   Pointer initial
6ad0: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
6ae0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22  he size of the "
6af0: 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20  respdata". *    
6b00: 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65       buffer.  Be
6b10: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
6b20: 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76  the pointed to v
6b30: 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20  alue is updated 
6b40: 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  to the. *       
6b50: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    number of byte
6b60: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
6b70: 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69   buffer.  If thi
6b80: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
6b90: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c  s. *         NUL
6ba0: 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  L, it will not b
6bb0: 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22  e updated, and "
6bc0: 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62  respdata" will b
6bd0: 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e  e ignored causin
6be0: 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  g. *         the
6bf0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74   response data t
6c00: 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  o be discarded..
6c10: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
6c20: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
6c30: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
6c40: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
6c50: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
6c60: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
6c70: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
6c80: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
6c90: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e  unction will con
6ca0: 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53  nect to the PC/S
6cb0: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e  C Connection Man
6cc0: 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20  ager via. *     
6cd0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
6ce0: 65 63 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e  ect() if needed.
6cf0: 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69  . *. *     It wi
6d00: 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68  ll connect to th
6d10: 65 20 63 61 72 64 20 69 6e 20 74 68 65 20 72 65  e card in the re
6d20: 61 64 65 72 20 61 74 74 61 63 68 65 64 20 74 6f  ader attached to
6d30: 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20   the slot. *    
6d40: 20 73 70 65 63 69 66 69 65 64 2e 20 20 49 74 20   specified.  It 
6d50: 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74  will reconnect t
6d60: 6f 20 74 68 65 20 63 61 72 64 20 69 66 20 74 68  o the card if th
6d70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20  e connection. * 
6d80: 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20      goes away.. 
6d90: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
6da0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
6db0: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
6dc0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
6dd0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
6de0: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
6df0: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
6e00: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
6e10: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
6e20: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
6e30: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
6e40: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
6e50: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
6e60: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
6e70: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
6e80: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
6e90: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
6ea0: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61  n) {..uint8_t ma
6eb0: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63  jor_rc, minor_rc
6ec0: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f  ;..size_t bytes_
6ed0: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73  to_copy, tmp_res
6ee0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 44 57 4f 52  pdata_len;..DWOR
6ef0: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f  D protocol;..DWO
6f00: 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63  RD xmit_len, rec
6f10: 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  v_len;..LONG sca
6f20: 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61  rd_xmit_ret, sca
6f30: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09  rd_reconn_ret;..
6f40: 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30  BYTE xmit_buf[10
6f50: 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30  24], recv_buf[10
6f60: 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  24];..int pcsc_c
6f70: 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63  onnect_ret, pcsc
6f80: 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69  _getresp_ret;..i
6f90: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  nt idx;...CACKEY
6fa0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6fb0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
6fc0: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45  !slot) {...CACKE
6fd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6fe0: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65  Invalid slot spe
6ff0: 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65  cified.");....re
7000: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7010: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7020: 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
7030: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
7040: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
7050: 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
7060: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
7070: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
7080: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7090: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
70a0: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
70b0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
70c0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
70d0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
70e0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
70f0: 20 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d   Transmit */..xm
7100: 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69  it_len = 0;..xmi
7110: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
7120: 5d 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74  ] = class;..xmit
7130: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
7140: 20 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a   = instruction;.
7150: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
7160: 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69  en++] = p1;..xmi
7170: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
7180: 5d 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74  ] = p2;..if (dat
7190: 61 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b  a) {...xmit_buf[
71a0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63  xmit_len++] = lc
71b0: 3b 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
71c0: 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b  ; idx < lc; idx+
71d0: 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66  +) {....xmit_buf
71e0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64  [xmit_len++] = d
71f0: 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d  ata[idx];...}..}
7200: 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30  ...if (le != 0x0
7210: 30 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b  0) {...xmit_buf[
7220: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65  xmit_len++] = le
7230: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20  ;..}.../* Begin 
7240: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
7250: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
7260: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
7270: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28  on(slot);...if (
7280: 63 6c 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43  class == GSCIS_C
7290: 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20  LASS_ISO7816 && 
72a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47  instruction == G
72b0: 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
72c0: 59 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 20  Y && p1 == 0x00 
72d0: 26 26 20 70 32 20 3d 3d 20 30 78 30 30 29 20 7b  && p2 == 0x00) {
72e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
72f0: 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20  PRINTF("Sending 
7300: 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64  APDU: <<censored
7310: 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  >>");..} else {.
7320: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7330: 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67  RINTBUF("Sending
7340: 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75   APDU:", xmit_bu
7350: 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d  f, xmit_len);..}
7360: 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
7370: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
7380: 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  .scard_xmit_ret 
7390: 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  = SCardTransmit(
73a0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
73b0: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c 20 78   SCARD_PCI_T0, x
73c0: 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65  mit_buf, xmit_le
73d0: 6e 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 31 2c  n, SCARD_PCI_T1,
73e0: 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76   recv_buf, &recv
73f0: 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 73 63 61 72  _len);..if (scar
7400: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43  d_xmit_ret != SC
7410: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
7420: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7430: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
7440: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63  o send APDU to c
7450: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
7460: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c  it() = %s/%lx)",
7470: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
7480: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
7490: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
74a0: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t), (unsigned lo
74b0: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
74c0: 65 74 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  et);...CACKEY_DE
74d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b  BUG_PRINTF("Mark
74e0: 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69  ing slot as havi
74f0: 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b  ng been reset");
7500: 0a 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
7510: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
7520: 0a 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65  ...slot->slot_re
7530: 73 65 74 20 3d 20 31 3b 0a 0a 09 09 69 66 20 28  set = 1;....if (
7540: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
7550: 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
7560: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
7570: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7580: 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
7590: 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
75a0: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
75b0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
75c0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
75d0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
75e0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
75f0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7600: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
7610: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
7620: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e  .if (scard_recon
7630: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  n_ret == SCARD_S
7640: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
7650: 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20  /* Re-establish 
7660: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
7670: 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a  it was present *
7680: 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e  /.....if (slot->
7690: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
76a0: 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  h > 0) {......sl
76b0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
76c0: 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61  depth--;......ca
76d0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
76e0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09  action(slot);...
76f0: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
7700: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
7710: 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20  set successful, 
7720: 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29  retransmitting")
7730: 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74  ;.....scard_xmit
7740: 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e  _ret = SCardTran
7750: 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  smit(slot->pcsc_
7760: 63 61 72 64 2c 20 53 43 41 52 44 5f 50 43 49 5f  card, SCARD_PCI_
7770: 54 30 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  T0, xmit_buf, xm
7780: 69 74 5f 6c 65 6e 2c 20 53 43 41 52 44 5f 50 43  it_len, SCARD_PC
7790: 49 5f 54 30 2c 20 72 65 63 76 5f 62 75 66 2c 20  I_T0, recv_buf, 
77a0: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09  &recv_len);.....
77b0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
77c0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
77d0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
77e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
77f0: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66  TF("Retransmit f
7800: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
7810: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65   in failure afte
7820: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  r disconnecting 
7830: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54  the card (SCardT
7840: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69  ransmit = %s/%li
7850: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
7860: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
7870: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
7880: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
7890: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
78a0: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
78b0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
78c0: 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45  card, SCARD_RESE
78d0: 54 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c  T_CARD);......sl
78e0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
78f0: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
7900: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7910: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7920: 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  */......slot->tr
7930: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
7940: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
7950: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
7960: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65  (slot);.......re
7970: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7980: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 09  _E_GENERIC);....
7990: 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  .}....} else {..
79a0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
79b0: 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65  PRINTF("Disconne
79c0: 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09  cting card");...
79d0: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
79e0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
79f0: 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f  rd, SCARD_RESET_
7a00: 43 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d  CARD);.....slot-
7a10: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
7a20: 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f  cted = 0;....../
7a30: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
7a40: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
7a50: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
7a60: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
7a70: 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
7a80: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
7a90: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
7aa0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
7ab0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
7ac0: 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
7ad0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7ae0: 45 52 49 43 29 3b 0a 09 09 09 7d 0a 09 09 7d 20  ERIC);....}...} 
7af0: 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
7b00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
7b10: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72  isconnecting car
7b20: 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  d");.....SCardDi
7b30: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
7b40: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
7b50: 52 45 53 45 54 5f 43 41 52 44 29 3b 0a 09 09 09  RESET_CARD);....
7b60: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
7b70: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
7b80: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7b90: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7ba0: 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  */....slot->tran
7bb0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
7bc0: 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  1;....cackey_end
7bd0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
7be0: 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  t);.....CACKEY_D
7bf0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
7c00: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7c10: 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43  e");....return(C
7c20: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7c30: 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  ERIC);...}..}...
7c40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7c50: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20  NTBUF("Returned 
7c60: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75  Value:", recv_bu
7c70: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  f, recv_len);...
7c80: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32  if (recv_len < 2
7c90: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c  ) {.../* Minimal
7ca0: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68   response length
7cb0: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74   is 2 bytes, ret
7cc0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7cd0: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  e */...CACKEY_DE
7ce0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
7cf0: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  onse too small, 
7d00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
7d10: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d  lure (recv_len =
7d20: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
7d30: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
7d40: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  );..../* End Sma
7d50: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
7d60: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
7d70: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
7d80: 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  lot);....return(
7d90: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7da0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
7db0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74  Determine result
7dc0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f   code */..major_
7dd0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
7de0: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69  cv_len - 2];..mi
7df0: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75  nor_rc = recv_bu
7e00: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b  f[recv_len - 1];
7e10: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20  ..if (respcode) 
7e20: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20  {...*respcode = 
7e30: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20  (major_rc << 8) 
7e40: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a  | minor_rc;..}..
7e50: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61  ./* Adjust messa
7e60: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65  ge buffer */..re
7e70: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f  cv_len -= 2;.../
7e80: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72  * Add bytes to r
7e90: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09  eturn value */..
7ea0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
7eb0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64   = 0;..if (respd
7ec0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f  ata && respdata_
7ed0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73  len) {...tmp_res
7ee0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73  pdata_len = *res
7ef0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79  pdata_len;....by
7f00: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72  tes_to_copy = *r
7f10: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09  espdata_len;....
7f20: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62  if (recv_len < b
7f30: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a  ytes_to_copy) {.
7f40: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
7f50: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d   = recv_len;...}
7f60: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7f70: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67  _PRINTF("Copying
7f80: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68   %lu bytes to th
7f90: 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27 64  e buffer (recv'd
7fa0: 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20   %lu bytes, but 
7fb0: 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c  only %lu bytes l
7fc0: 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65  eft in our buffe
7fd0: 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  r)", (unsigned l
7fe0: 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f  ong) bytes_to_co
7ff0: 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  py, (unsigned lo
8000: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75  ng) recv_len, (u
8010: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72  nsigned long) *r
8020: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
8030: 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74 61  .memcpy(respdata
8040: 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65  , recv_buf, byte
8050: 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65  s_to_copy);...re
8060: 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f  spdata += bytes_
8070: 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73  to_copy;....*res
8080: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65  pdata_len = byte
8090: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70  s_to_copy;...tmp
80a0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d  _respdata_len -=
80b0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
80c0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
80d0: 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  recv_len != 0) {
80e0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
80f0: 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e  _PRINTF("Throwin
8100: 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65 73  g away %lu bytes
8110: 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74  , nowhere to put
8120: 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e   them!", (unsign
8130: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
8140: 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  n);...}..}...if 
8150: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36  (major_rc == 0x6
8160: 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65  1) {.../* We nee
8170: 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43  d to READ */...C
8180: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8190: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20  TF("Buffer read 
81a0: 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69  required");....i
81b0: 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30  f (minor_rc == 0
81c0: 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f  x00) {....minor_
81d0: 72 63 20 3d 20 32 35 33 3b 0a 09 09 7d 0a 0a 09  rc = 253;...}...
81e0: 09 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65  .pcsc_getresp_re
81f0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
8200: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
8210: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
8220: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
8230: 52 45 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20  RESPONSE, 0x00, 
8240: 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d  0x00, 0, NULL, m
8250: 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f 64  inor_rc, respcod
8260: 65 2c 20 72 65 73 70 64 61 74 61 2c 20 26 74 6d  e, respdata, &tm
8270: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b  p_respdata_len);
8280: 0a 09 09 69 66 20 28 70 63 73 63 5f 67 65 74 72  ...if (pcsc_getr
8290: 65 73 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  esp_ret != CACKE
82a0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
82b0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
82c0: 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65  RINTF("Buffer re
82d0: 61 64 20 66 61 69 6c 65 64 21 20 20 52 65 74 75  ad failed!  Retu
82e0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
82f0: 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53  ");...../* End S
8300: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
8310: 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
8320: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
8330: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74  n(slot);.....ret
8340: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8350: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
8360: 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 61 5f  ...if (respdata_
8370: 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70 64  len) {....*respd
8380: 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72  ata_len += tmp_r
8390: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d  espdata_len;...}
83a0: 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
83b0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
83c0: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
83d0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
83e0: 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
83f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
8400: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
8410: 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63 6f   (buffer read co
8420: 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65 74  mplete)");...ret
8430: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8440: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45  S_OK);..}.../* E
8450: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
8460: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
8470: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
8480: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20  ion(slot);...if 
8490: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39  (major_rc == 0x9
84a0: 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73  0) {.../* Succes
84b0: 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  s */...CACKEY_DE
84c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
84d0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
84e0: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39   (major_rc = 0x9
84f0: 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0)");....return(
8500: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8510: 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f  );..}....CACKEY_
8520: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50  DEBUG_PRINTF("AP
8530: 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20 65  DU Returned an e
8540: 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67 20  rror, returning 
8550: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
8560: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8570: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d  SC_E_GENERIC);.}
8580: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
8590: 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20  . *     ssize_t 
85a0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
85b0: 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  er(struct cackey
85c0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
85d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
85e0: 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  er, size_t count
85f0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
8600: 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69  t_or_v, size_t i
8610: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a  nitial_offset);.
8620: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
8630: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
8640: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
8650: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
8660: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
8670: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e   to. *. *     un
8680: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
8690: 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  fer. *         [
86a0: 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20  OUT] Buffer. *. 
86b0: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75  *     size_t cou
86c0: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75  nt. *         Nu
86d0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
86e0: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
86f0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
8700: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a  ned char t_or_v.
8710: 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65 63   *         Selec
8720: 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20 28  t the T-buffer (
8730: 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20  01) or V-buffer 
8740: 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f  (02) to read fro
8750: 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73  m.  . *. *     s
8760: 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66  ize_t initial_of
8770: 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20  fset. *         
8780: 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66 73  Specify the offs
8790: 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  et to begin the 
87a0: 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a  read from. *. *.
87b0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
87c0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
87d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
87e0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
87f0: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20   actually read, 
8800: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a  or -1 on error..
8810: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
8820: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
8830: 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
8840: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
8850: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8860: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
8870: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
8880: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
8890: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
88a0: 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69  or_v, size_t ini
88b0: 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09  tial_offset) {..
88c0: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20  size_t offset = 
88d0: 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d  0, max_offset, m
88e0: 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67  ax_count;..unsig
88f0: 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b  ned char cmd[2];
8900: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63  ..uint16_t respc
8910: 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ode;..int send_r
8920: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
8930: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
8940: 64 2e 22 29 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73  d.");...max_offs
8950: 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78  et = count;..max
8960: 5f 63 6f 75 6e 74 20 3d 20 32 35 32 3b 0a 0a 09  _count = 252;...
8970: 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20  if (t_or_v != 1 
8980: 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20  && t_or_v != 2) 
8990: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
89a0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
89b0: 20 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65   T or V paramete
89c0: 72 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74  r specified, ret
89d0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
89e0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  e");....return(-
89f0: 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20  1);..}...cmd[0] 
8a00: 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c  = t_or_v;...whil
8a10: 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66  e (1) {...if (of
8a20: 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73  fset >= max_offs
8a30: 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  et) {....CACKEY_
8a40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
8a50: 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  ffer too small, 
8a60: 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77  returning what w
8a70: 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09  e got...");.....
8a80: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f  break;...}....co
8a90: 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74  unt = max_offset
8aa0: 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20   - offset;...if 
8ab0: 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75  (count > max_cou
8ac0: 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d  nt) {....count =
8ad0: 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a   max_count;...}.
8ae0: 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e  ...cmd[1] = coun
8af0: 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d  t;....send_ret =
8b00: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
8b10: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
8b20: 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46  ASS_GLOBAL_PLATF
8b30: 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  ORM, GSCIS_INSTR
8b40: 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28  _READ_BUFFER, ((
8b50: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b  initial_offset +
8b60: 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26   offset) >> 8) &
8b70: 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f   0xff, (initial_
8b80: 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29  offset + offset)
8b90: 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28   & 0xff, sizeof(
8ba0: 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c  cmd), cmd, 0x00,
8bb0: 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66   &respcode, buff
8bc0: 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f  er + offset, &co
8bd0: 75 6e 74 29 3b 0a 09 09 69 66 20 28 73 65 6e 64  unt);...if (send
8be0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
8bf0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69  CSC_S_OK) {....i
8c00: 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
8c10: 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20  x6A86) {.....if 
8c20: 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29  (max_count == 1)
8c30: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
8c40: 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f  ...}......max_co
8c50: 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20  unt = max_count 
8c60: 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e  / 2;......contin
8c70: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  ue;....}.....CAC
8c80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8c90: 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  ("cackey_send_ap
8ca0: 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74  du() failed, ret
8cb0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
8cc0: 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  e");.....return(
8cd0: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73  -1);...}....offs
8ce0: 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09  et += count;....
8cf0: 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f  if (count < max_
8d00: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
8d10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8d20: 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63  "Short read -- c
8d30: 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31  ount = %i, cmd[1
8d40: 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63  ] = %i", (int) c
8d50: 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b  ount, (int) cmd[
8d60: 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  1]);.....break;.
8d70: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  ..}..}..#ifdef C
8d80: 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
8d90: 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
8da0: 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66  SIZE_MAX..if (of
8db0: 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53  fset > _POSIX_SS
8dc0: 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
8dd0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8de0: 28 22 4f 66 66 73 65 74 20 65 78 63 65 65 64 73  ("Offset exceeds
8df0: 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
8e00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
8e10: 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
8e20: 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22  , offset = %lu)"
8e30: 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
8e40: 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
8e50: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65  gned long) offse
8e60: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
8e70: 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
8e80: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
8e90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
8ea0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
8eb0: 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65  s, read %lu byte
8ec0: 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
8ed0: 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72  ng) offset);...r
8ee0: 65 74 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d  eturn(offset);.}
8ef0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
8f00: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
8f10: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
8f20: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
8f30: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8f40: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
8f50: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
8f60: 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  _len);. *. * ARG
8f70: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
8f80: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
8f90: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
8fa0: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
8fb0: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
8fc0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
8fd0: 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20  ar *aid. *      
8fe0: 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69     Buffer contai
8ff0: 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74  ning Applet ID t
9000: 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20  o select. *. *  
9010: 20 20 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65     size_t aid_le
9020: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  n. *         Num
9030: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
9040: 74 68 65 20 22 61 69 64 22 20 28 41 70 70 6c 65  the "aid" (Apple
9050: 74 20 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a  t ID) parameter.
9060: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
9070: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
9080: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
9090: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
90a0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
90b0: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
90c0: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
90d0: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
90e0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
90f0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
9100: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72  elect_applet(str
9110: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9120: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
9130: 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f  char *aid, size_
9140: 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e  t aid_len) {..in
9150: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
9160: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9170: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
9180: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9190: 4e 54 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67  NTBUF("Selecting
91a0: 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20   applet:", aid, 
91b0: 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64  aid_len);...send
91c0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
91d0: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
91e0: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
91f0: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  6, GSCIS_INSTR_S
9200: 45 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52  ELECT, GSCIS_PAR
9210: 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54  AM_SELECT_APPLET
9220: 2c 20 30 78 30 43 2c 20 61 69 64 5f 6c 65 6e 2c  , 0x0C, aid_len,
9230: 20 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c   aid, 0x00, NULL
9240: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
9250: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
9260: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
9270: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9280: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
9290: 64 20 74 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74  d to open applet
92a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
92b0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
92c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
92d0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
92e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
92f0: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
9300: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65  ly selected file
9310: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
9320: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
9330: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
9340: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
9350: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  ret cackey_selec
9360: 74 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61  t_file(struct ca
9370: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
9380: 20 75 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20   uint16_t ef);. 
9390: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
93a0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
93b0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
93c0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
93d0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
93e0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e  to. *. *     uin
93f0: 74 31 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20  t16_t ef. *     
9400: 20 20 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69      Elemental Fi
9410: 6c 65 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a  le to select. *.
9420: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
9430: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
9440: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
9450: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
9460: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
9470: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
9480: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
9490: 20 2a 20 20 20 20 20 54 68 69 73 20 73 65 6c 65   *     This sele
94a0: 63 74 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72  cts an Elementar
94b0: 79 20 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65  y File (EF) unde
94c0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  r the currently 
94d0: 73 65 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20  selected. *     
94e0: 44 65 64 69 63 61 74 65 64 20 46 69 6c 65 20 28  Dedicated File (
94f0: 44 46 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79  DF). *. *     Ty
9500: 70 69 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20  pically this is 
9510: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c  called after sel
9520: 65 63 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65  ecting the corre
9530: 63 74 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67  ct Applet (using
9540: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
9550: 65 6c 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f  elect_applet) fo
9560: 72 20 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a  r VM cards. *. *
9570: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
9580: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  ret cackey_selec
9590: 74 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61  t_file(struct ca
95a0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
95b0: 20 75 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a   uint16_t ef) {.
95c0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66  .unsigned char f
95d0: 69 64 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20  id_buf[2];..int 
95e0: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  send_ret;...CACK
95f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9600: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a  "Called.");.../*
9610: 20 4f 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e   Open the elemen
9620: 74 61 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69  tary file */..fi
9630: 64 5f 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e  d_buf[0] = (ef >
9640: 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69  > 8) & 0xff;..fi
9650: 64 5f 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20  d_buf[1] = ef & 
9660: 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0xff;...CACKEY_D
9670: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c  EBUG_PRINTF("Sel
9680: 65 63 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34  ecting file: %04
9690: 6c 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lx", (unsigned l
96a0: 6f 6e 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64  ong) ef);...send
96b0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
96c0: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
96d0: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
96e0: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  6, GSCIS_INSTR_S
96f0: 45 4c 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30  ELECT, 0x02, 0x0
9700: 43 2c 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75  C, sizeof(fid_bu
9710: 66 29 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30  f), fid_buf, 0x0
9720: 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  0, NULL, NULL, N
9730: 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  ULL);..if (send_
9740: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
9750: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
9760: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9770: 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  ("Failed to open
9780: 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67   file, returning
9790: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
97a0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
97b0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
97c0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
97d0: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65  UG_PRINTF("Succe
97e0: 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64  ssfully selected
97f0: 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72   file");...retur
9800: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
9810: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
9820: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f  NPOSIS. *     vo
9830: 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74  id cackey_free_t
9840: 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  lv(struct cackey
9850: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f  _tlv_entity *roo
9860: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
9870: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
9880: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
9890: 69 74 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20  ity *root. *    
98a0: 20 20 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65       Root of the
98b0: 20 54 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61   TLV list to sta
98c0: 72 74 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a  rt freeing. *. *
98d0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
98e0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
98f0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
9900: 73 20 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73  s function frees
9910: 20 74 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20   the TLV linked 
9920: 6c 69 73 74 65 64 20 72 65 74 75 72 6e 65 64 20  listed returned 
9930: 66 72 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63  from. *     "cac
9940: 6b 65 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a  key_read_tlv". *
9950: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
9960: 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76   cackey_free_tlv
9970: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  (struct cackey_t
9980: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29  lv_entity *root)
9990: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
99a0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75  y_tlv_entity *cu
99b0: 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20  rr, *next;...if 
99c0: 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (root == NULL) {
99d0: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
99e0: 66 6f 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74  for (curr = root
99f0: 3b 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e  ; curr; curr = n
9a00: 65 78 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20  ext) {...next = 
9a10: 63 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09  curr->_next;....
9a20: 73 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61  switch (curr->ta
9a30: 67 29 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43  g) {....case GSC
9a40: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
9a50: 3a 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  :....case GSCIS_
9a60: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
9a70: 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76  .....if (curr->v
9a80: 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65  alue) {......fre
9a90: 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a  e(curr->value);.
9aa0: 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
9ab0: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
9ac0: 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09  AG_CARDURL:.....
9ad0: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f  if (curr->value_
9ae0: 63 61 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09  cardurl) {......
9af0: 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65  free(curr->value
9b00: 5f 63 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d  _cardurl);.....}
9b10: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
9b20: 0a 09 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09  ...free(curr);..
9b30: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
9b40: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
9b50: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
9b60: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
9b70: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
9b80: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
9b90: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
9ba0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
9bb0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
9bc0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
9bd0: 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76  *cackey_read_tlv
9be0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
9bf0: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74  lot *slot) {..st
9c00: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
9c10: 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74  entity *curr_ent
9c20: 69 74 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c  ity, *root = NUL
9c30: 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b  L, *last = NULL;
9c40: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
9c50: 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61  tlen_buf[2], tva
9c60: 6c 5f 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76  l_buf[1024], *tv
9c70: 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  al;..unsigned ch
9c80: 61 72 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20  ar vlen_buf[2], 
9c90: 76 76 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20  vval_buf[8192], 
9ca0: 2a 76 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64  *vval;..unsigned
9cb0: 20 63 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09   char *tmpbuf;..
9cc0: 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c  ssize_t tlen, vl
9cd0: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61  en;..ssize_t rea
9ce0: 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f  d_ret;..size_t o
9cf0: 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66  ffset_t = 0, off
9d00: 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69  set_v = 0;..unsi
9d10: 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a 09  gned char tag;..
9d20: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23  size_t length;.#
9d30: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
9d40: 09 75 4c 6f 6e 67 66 20 74 6d 70 62 75 66 6c 65  .uLongf tmpbufle
9d50: 6e 3b 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65  n;..int uncompre
9d60: 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a  ss_ret;.#endif..
9d70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9d80: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
9d90: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
9da0: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
9db0: 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c  (slot, tlen_buf,
9dc0: 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66   sizeof(tlen_buf
9dd0: 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b  ), 1, offset_t);
9de0: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
9df0: 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75  = sizeof(tlen_bu
9e00: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
9e10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61  EBUG_PRINTF("Rea
9e20: 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  d failed, return
9e30: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
9e40: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
9e50: 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28  );..}...tlen = (
9e60: 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38  tlen_buf[1] << 8
9e70: 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b  ) | tlen_buf[0];
9e80: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
9e90: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
9ea0: 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c  (slot, vlen_buf,
9eb0: 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66   sizeof(vlen_buf
9ec0: 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b  ), 2, offset_v);
9ed0: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
9ee0: 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75  = sizeof(vlen_bu
9ef0: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
9f00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61  EBUG_PRINTF("Rea
9f10: 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  d failed, return
9f20: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
9f30: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
9f40: 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28  );..}...vlen = (
9f50: 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38  vlen_buf[1] << 8
9f60: 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b  ) | vlen_buf[0];
9f70: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9f80: 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67  PRINTF("Tag Leng
9f90: 74 68 20 3d 20 25 69 2c 20 56 61 6c 75 65 20 4c  th = %i, Value L
9fa0: 65 6e 67 74 68 20 3d 20 25 69 22 2c 20 74 6c 65  ength = %i", tle
9fb0: 6e 2c 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73  n, vlen);...offs
9fc0: 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73  et_t += 2;..offs
9fd0: 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20  et_v += 2;...if 
9fe0: 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74  (tlen > sizeof(t
9ff0: 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  val_buf)) {...CA
a000: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a010: 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73  F("Tag length is
a020: 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75   too large, retu
a030: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
a040: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
a050: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c  LL);..}...if (vl
a060: 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c  en > sizeof(vval
a070: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
a080: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a090: 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20  Value length is 
a0a0: 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72  too large, retur
a0b0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
a0c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
a0d0: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  L);..}...read_re
a0e0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
a0f0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61  buffer(slot, tva
a100: 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20  l_buf, tlen, 1, 
a110: 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28  offset_t);..if (
a120: 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e  read_ret != tlen
a130: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a140: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
a150: 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65  e to read entire
a160: 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72   T-buffer, retur
a170: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
a180: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
a190: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  L);..}...read_re
a1a0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
a1b0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61  buffer(slot, vva
a1c0: 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20  l_buf, vlen, 2, 
a1d0: 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28  offset_v);..if (
a1e0: 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e  read_ret != vlen
a1f0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a200: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
a210: 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65  e to read entire
a220: 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72   V-buffer, retur
a230: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
a240: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
a250: 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20  L);..}...tval = 
a260: 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20  tval_buf;..vval 
a270: 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69  = vval_buf;..whi
a280: 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20  le (tlen > 0 && 
a290: 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61  vlen > 0) {...ta
a2a0: 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61  g = *tval;...tva
a2b0: 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a  l++;...tlen--;..
a2c0: 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30  ..if (*tval == 0
a2d0: 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68  xff) {....length
a2e0: 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38   = (tval[2] << 8
a2f0: 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09  ) | tval[1];....
a300: 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c  tval += 3;....tl
a310: 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73  en -= 3;...} els
a320: 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20  e {....length = 
a330: 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b  *tval;....tval++
a340: 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d  ;....tlen--;...}
a350: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a360: 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73  _PRINTF("Tag: %s
a370: 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59   (%02x)", CACKEY
a380: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
a390: 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e  TO_STR(tag), (un
a3a0: 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29  signed int) tag)
a3b0: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
a3c0: 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65  _PRINTBUF("Value
a3d0: 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  :", vval, length
a3e0: 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74  );....curr_entit
a3f0: 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74  y = NULL;...swit
a400: 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61  ch (tag) {....ca
a410: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
a420: 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65  DURL:.....curr_e
a430: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
a440: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
a450: 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65  ty));.....curr_e
a460: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
a470: 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  durl = malloc(si
a480: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
a490: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
a4a0: 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  ));......memcpy(
a4b0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
a4c0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
a4d0: 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63   vval, 5);.....c
a4e0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
a4f0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
a500: 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09  pe = vval[5];...
a510: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
a520: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
a530: 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36  jectid = (vval[6
a540: 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37  ] << 8) | vval[7
a550: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
a560: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
a570: 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c  l->appid = (vval
a580: 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [8] << 8) | vval
a590: 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  [9];......curr_e
a5a0: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
a5b0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
a5c0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
a5d0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
a5e0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
a5f0: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75  CR_TABLE:.....cu
a600: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
a610: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
a620: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d  entity));.....tm
a630: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65  pbuf = malloc(le
a640: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63  ngth);......memc
a650: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
a660: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63   length);......c
a670: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
a680: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
a690: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
a6a0: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72   length;.....cur
a6b0: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
a6c0: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
a6d0: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
a6e0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
a6f0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
a700: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
a710: 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  TE:.....curr_ent
a720: 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ity = malloc(siz
a730: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
a740: 29 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ));......tmpbufl
a750: 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b  en = length * 2;
a760: 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
a770: 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b  lloc(tmpbuflen);
a780: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49  ..#ifdef HAVE_LI
a790: 42 5a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  BZ.....uncompres
a7a0: 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65  s_ret = uncompre
a7b0: 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62  ss(tmpbuf, &tmpb
a7c0: 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e  uflen, vval, len
a7d0: 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e  gth);.....if (un
a7e0: 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20  compress_ret != 
a7f0: 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43  Z_OK) {......CAC
a800: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a810: 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f  ("Failed to deco
a820: 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65  mpress, uncompre
a830: 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69  ss() returned %i
a840: 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f   -- resorting to
a850: 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75   direct copy", u
a860: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a  ncompress_ret);.
a870: 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
a880: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d  = length;......m
a890: 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76  emcpy(tmpbuf, vv
a8a0: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09  al, length);....
a8b0: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
a8c0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44  EBUG_PRINTBUF("D
a8d0: 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22  ecompressed to:"
a8e0: 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66  , tmpbuf, tmpbuf
a8f0: 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09  len);.#else.....
a900: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a910: 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49  NTF("Missing ZLI
a920: 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20  B Support, this 
a930: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c  certificate is l
a940: 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e  ikely useless...
a950: 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ");......tmpbufl
a960: 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  en = length;....
a970: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
a980: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23  vval, length);.#
a990: 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f  endif......curr_
a9a0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
a9b0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
a9c0: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70  ty->length = tmp
a9d0: 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72  buflen;.....curr
a9e0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d  _entity->value =
a9f0: 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72   tmpbuf;.....cur
aa00: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
aa10: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
aa20: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
aa30: 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09  S_TAG_PKCS15:...
aa40: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
aa50: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
aa60: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09  urr_entity));...
aa70: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
aa80: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
aa90: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
aaa0: 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d  e_byte = vval[0]
aab0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
aac0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
aad0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
aae0: 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67  ....vval += leng
aaf0: 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65  th;...vlen -= le
ab00: 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72  ngth;....if (cur
ab10: 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c  r_entity != NULL
ab20: 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20  ) {....if (root 
ab30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72  == NULL) {.....r
ab40: 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  oot = curr_entit
ab50: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  y;....}.....if (
ab60: 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  last != NULL) {.
ab70: 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20  ....last->_next 
ab80: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
ab90: 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63  ..}.....last = c
aba0: 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a  urr_entity;...}.
abb0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74  .}...return(root
abc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
abd0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
abe0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
abf0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ac00: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
ac10: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
ac20: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
ac30: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f   *. */.static vo
ac40: 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  id cackey_free_c
ac50: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
ac60: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
ac70: 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20   *start, size_t 
ac80: 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f  count, int free_
ac90: 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74  start) {..size_t
aca0: 20 69 64 78 3b 0a 0a 09 66 6f 72 20 28 69 64 78   idx;...for (idx
acb0: 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e   = 0; idx < coun
acc0: 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  t; idx++) {...if
acd0: 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72   (start[idx].cer
ace0: 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09 66  tificate) {....f
acf0: 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d 2e 63  ree(start[idx].c
ad00: 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 09 7d  ertificate);...}
ad10: 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 73  ..}...if (free_s
ad20: 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 28 73  tart) {...free(s
ad30: 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  tart);..}...retu
ad40: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
ad50: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
ad60: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
ad70: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
ad80: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
ad90: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
ada0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
adb0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
adc0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
add0: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b  c_identity *cack
ade0: 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 74  ey_read_certs(st
adf0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
ae00: 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63   *slot, struct c
ae10: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
ae20: 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e 73 69  ity *certs, unsi
ae30: 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74  gned long *count
ae40: 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
ae50: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
ae60: 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74 72 75   *curr_id;..stru
ae70: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
ae80: 74 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a  tity *ccc_tlv, *
ae90: 63 63 63 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74  ccc_curr, *app_t
aea0: 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09  lv, *app_curr;..
aeb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 63  unsigned char cc
aec0: 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53  c_aid[] = {GSCIS
aed0: 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 75 6e 73 69  _AID_CCC};..unsi
aee0: 67 6e 65 64 20 63 68 61 72 20 63 75 72 72 5f 61  gned char curr_a
aef0: 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64  id[7];..unsigned
af00: 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30   long outidx = 0
af10: 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72  ;..cackey_ret tr
af20: 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09  ansaction_ret;..
af30: 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61  int certs_resiza
af40: 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ble;..int send_r
af50: 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a  et, select_ret;.
af60: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
af70: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
af80: 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d  ;...if (count ==
af90: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
afa0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
afb0: 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72  count is NULL, r
afc0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
afd0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
afe0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
aff0: 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20  (certs != NULL) 
b000: 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d  {...if (*count =
b010: 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
b020: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
b030: 65 71 75 65 73 74 65 64 20 77 65 20 72 65 74 75  equested we retu
b040: 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68  rn 0 objects, sh
b050: 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a  ort-circuit");..
b060: 09 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29  ...return(certs)
b070: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65  ;...}..}.../* Be
b080: 67 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20  gin a SmartCard 
b090: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
b0a0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20  transaction_ret 
b0b0: 3d 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  = cackey_begin_t
b0c0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
b0d0: 3b 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69  ;..if (transacti
b0e0: 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  on_ret != CACKEY
b0f0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
b100: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b110: 4e 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69  NTF("Unable begi
b120: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  n transaction, r
b130: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
b140: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
b150: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
b160: 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20  (certs == NULL) 
b170: 7b 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c  {...certs = mall
b180: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  oc(sizeof(*certs
b190: 29 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74  ) * 5);...*count
b1a0: 20 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65   = 5;...certs_re
b1b0: 73 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20  sizable = 1;..} 
b1c0: 65 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72  else {...certs_r
b1d0: 65 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d  esizable = 0;..}
b1e0: 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65  .../* Select the
b1f0: 20 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09   CCC Applet */..
b200: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
b210: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
b220: 73 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73  slot, ccc_aid, s
b230: 69 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b  izeof(ccc_aid));
b240: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
b250: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
b260: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
b270: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
b280: 62 6c 65 20 74 6f 20 73 65 6c 65 63 74 20 43 43  ble to select CC
b290: 43 20 41 70 70 6c 65 74 2c 20 72 65 74 75 72 6e  C Applet, return
b2a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b2b0: 3b 0a 0a 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74  ;..../* Terminat
b2c0: 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e  e SmartCard Tran
b2d0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  saction */...cac
b2e0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b2f0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65  ion(slot);....re
b300: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
b310: 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65  ./* Read all the
b320: 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68   applets from th
b330: 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09  e CCC's TLV */..
b340: 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  ccc_tlv = cackey
b350: 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
b360: 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43  .../* Look for C
b370: 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f 6f  ARDURLs that coo
b380: 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61  respond to PKI a
b390: 70 70 6c 65 74 73 20 2a 2f 0a 09 66 6f 72 20 28  pplets */..for (
b3a0: 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74  ccc_curr = ccc_t
b3b0: 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63  lv; ccc_curr; cc
b3c0: 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72  c_curr = ccc_cur
b3d0: 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 43 41  r->_next) {...CA
b3e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b3f0: 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73  F("Found tag: %s
b400: 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44   ... ", CACKEY_D
b410: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
b420: 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74  _STR(ccc_curr->t
b430: 61 67 29 29 3b 0a 0a 09 09 69 66 20 28 63 63 63  ag));....if (ccc
b440: 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53  _curr->tag != GS
b450: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29  CIS_TAG_CARDURL)
b460: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
b470: 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
b480: 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65   skipping it (we
b490: 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
b4a0: 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09   CARDURLs)");...
b4b0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
b4c0: 0a 09 09 69 66 20 28 28 63 63 63 5f 63 75 72 72  ...if ((ccc_curr
b4d0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
b4e0: 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 4b 45  >apptype & CACKE
b4f0: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21  Y_TLV_APP_PKI) !
b500: 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  = CACKEY_TLV_APP
b510: 5f 50 4b 49 29 20 7b 0a 09 09 09 43 41 43 4b 45  _PKI) {....CACKE
b520: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b530: 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
b540: 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
b550: 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c 65 74  about PKI applet
b560: 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74 20 73  s, this applet s
b570: 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30 32 78  upports: %s/%02x
b580: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
b590: 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f  _FUNC_APPTYPE_TO
b5a0: 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76  _STR(ccc_curr->v
b5b0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
b5c0: 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65  ptype), (unsigne
b5d0: 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72 72 2d  d int) ccc_curr-
b5e0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
b5f0: 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09 63 6f  apptype);.....co
b600: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 43  ntinue;...}....C
b610: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b620: 54 42 55 46 28 22 52 49 44 3a 22 2c 20 63 63 63  TBUF("RID:", ccc
b630: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b640: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
b650: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
b660: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
b670: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
b680: 5f 50 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d  _PRINTF("AppID =
b690: 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b   %s/%04lx", CACK
b6a0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42  EY_DEBUG_FUNC_OB
b6b0: 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  JID_TO_STR(ccc_c
b6c0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
b6d0: 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73  rl->appid), (uns
b6e0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f  igned long) ccc_
b6f0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
b700: 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 43  url->appid);...C
b710: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b720: 54 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25  TF("ObjectID = %
b730: 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59  s/%04lx", CACKEY
b740: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49  _DEBUG_FUNC_OBJI
b750: 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  D_TO_STR(ccc_cur
b760: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
b770: 2d 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e  ->objectid), (un
b780: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63  signed long) ccc
b790: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b7a0: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
b7b0: 0a 0a 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
b7c0: 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  aid, ccc_curr->v
b7d0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
b7e0: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
b7f0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b800: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 63 75 72 72  l->rid));...curr
b810: 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72  _aid[sizeof(curr
b820: 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63  _aid) - 2] = (cc
b830: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
b840: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20  rdurl->appid >> 
b850: 38 29 20 26 20 30 78 66 66 3b 0a 09 09 63 75 72  8) & 0xff;...cur
b860: 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72  r_aid[sizeof(cur
b870: 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 63  r_aid) - 1] = cc
b880: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
b890: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 30  rdurl->appid & 0
b8a0: 78 66 66 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65 63  xff;..../* Selec
b8b0: 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e  t found applet .
b8c0: 2e 2e 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72  .. */...select_r
b8d0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
b8e0: 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ct_applet(slot, 
b8f0: 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66  curr_aid, sizeof
b900: 28 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 69  (curr_aid));...i
b910: 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d  f (select_ret !=
b920: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
b930: 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  K) {....CACKEY_D
b940: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
b950: 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70  led to select ap
b960: 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70  plet, skipping p
b970: 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69  rocessing of thi
b980: 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  s object");.....
b990: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
b9a0: 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65  ./* ... and obje
b9b0: 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 73  ct (file) */...s
b9c0: 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  elect_ret = cack
b9d0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
b9e0: 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  lot, ccc_curr->v
b9f0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
ba00: 6a 65 63 74 69 64 29 3b 0a 09 09 69 66 20 28 73  jectid);...if (s
ba10: 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  elect_ret != CAC
ba20: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
ba30: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ba40: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
ba50: 74 6f 20 73 65 6c 65 63 74 20 66 69 6c 65 2c 20  to select file, 
ba60: 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73  skipping process
ba70: 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  ing of this obje
ba80: 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  ct");.....contin
ba90: 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 50 72  ue;...}..../* Pr
baa0: 6f 63 65 73 73 20 74 68 69 73 20 66 69 6c 65 27  ocess this file'
bab0: 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f  s TLV looking fo
bac0: 72 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a  r certificates *
bad0: 2f 0a 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61  /...app_tlv = ca
bae0: 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c  ckey_read_tlv(sl
baf0: 6f 74 29 3b 0a 0a 09 09 66 6f 72 20 28 61 70 70  ot);....for (app
bb00: 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b  _curr = app_tlv;
bb10: 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f 63   app_curr; app_c
bb20: 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e  urr = app_curr->
bb30: 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b  _next) {....CACK
bb40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bb50: 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c  "Found tag: %s",
bb60: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
bb70: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70  NC_TAG_TO_STR(ap
bb80: 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09  p_curr->tag));..
bb90: 09 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e  ..if (app_curr->
bba0: 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47  tag != GSCIS_TAG
bbb0: 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
bbc0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
bbd0: 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
bbe0: 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
bbf0: 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
bc00: 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a  ERTIFICATEs)");.
bc10: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
bc20: 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20  ..}.....curr_id 
bc30: 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d  = &certs[outidx]
bc40: 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a  ;....outidx++;..
bc50: 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
bc60: 64 2d 3e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f  d->applet, curr_
bc70: 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  aid, sizeof(curr
bc80: 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09  _id->applet));..
bc90: 09 09 63 75 72 72 5f 69 64 2d 3e 66 69 6c 65 20  ..curr_id->file 
bca0: 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
bcb0: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
bcc0: 74 69 64 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d  tid;....curr_id-
bcd0: 3e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  >label = NULL;..
bce0: 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69  ..curr_id->keysi
bcf0: 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 43 41 43  ze = -1;.....CAC
bd00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bd10: 28 22 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69  ("Filling curr_i
bd20: 64 2d 3e 61 70 70 6c 65 74 20 28 25 70 29 20 77  d->applet (%p) w
bd30: 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c  ith %lu bytes:",
bd40: 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74   curr_id->applet
bd50: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
bd60: 29 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  ) sizeof(curr_id
bd70: 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 43  ->applet));....C
bd80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bd90: 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72  TBUF("VAL:", cur
bda0: 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73 69  r_id->applet, si
bdb0: 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70  zeof(curr_id->ap
bdc0: 70 6c 65 74 29 29 3b 0a 0a 09 09 09 63 75 72 72  plet));.....curr
bdd0: 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
bde0: 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d  _len = app_curr-
bdf0: 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 63 75 72  >length;.....cur
be00: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
be10: 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
be20: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
be30: 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28  len);....memcpy(
be40: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
be50: 63 61 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e  cate, app_curr->
be60: 76 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e  value, curr_id->
be70: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
be80: 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78  ;.....if (outidx
be90: 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
bea0: 09 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 69  ..if (certs_resi
beb0: 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09 09 2a 63  zable) {......*c
bec0: 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09  ount *= 2;......
bed0: 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28  certs = realloc(
bee0: 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63  certs, sizeof(*c
bef0: 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29  erts) * (*count)
bf00: 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
bf10: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
bf20: 7d 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61  }....}...}....ca
bf30: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70  ckey_free_tlv(ap
bf40: 70 5f 74 6c 76 29 3b 0a 0a 09 09 69 66 20 28 6f  p_tlv);....if (o
bf50: 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
bf60: 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d   {....break;...}
bf70: 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 72 65  ..}...cackey_fre
bf80: 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a  e_tlv(ccc_tlv);.
bf90: 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64  ..*count = outid
bfa0: 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72  x;...if (certs_r
bfb0: 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65  esizable) {...ce
bfc0: 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65  rts = realloc(ce
bfd0: 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72  rts, sizeof(*cer
bfe0: 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b  ts) * (*count));
bff0: 0a 09 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61  ..}.../* Termina
c000: 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 61  te SmartCard Tra
c010: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
c020: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
c030: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74  ion(slot);...ret
c040: 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f  urn(certs);.}../
c050: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
c060: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
c070: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
c080: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
c090: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
c0a0: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
c0b0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
c0c0: 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
c0d0: 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
c0e0: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
c0f0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75  slot *slot, stru
c100: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
c110: 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e  ty *identity, un
c120: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
c130: 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c  , size_t buflen,
c140: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c150: 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f  outbuf, size_t o
c160: 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61  utbuflen, int pa
c170: 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 61  dInput, int unpa
c180: 64 4f 75 74 70 75 74 29 20 7b 0a 09 75 6e 73 69  dOutput) {..unsi
c190: 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75  gned char *tmpbu
c1a0: 66 2c 20 2a 74 6d 70 62 75 66 5f 73 3b 0a 09 75  f, *tmpbuf_s;..u
c1b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 79 74  nsigned char byt
c1c0: 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a  es_to_send, p1;.
c1d0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
c1e0: 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65  locktype;..cacke
c1f0: 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a  y_ret send_ret;.
c200: 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f  .uint16_t respco
c210: 64 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74  de;..ssize_t ret
c220: 76 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66  val = 0, unpadof
c230: 66 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d  fset;..size_t tm
c240: 70 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c  pbuflen, padlen,
c250: 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
c260: 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20  int free_tmpbuf 
c270: 3d 20 30 2c 20 73 65 70 42 79 74 65 20 3d 20 2d  = 0, sepByte = -
c280: 31 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41  1;..int le;...CA
c290: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c2a0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
c2b0: 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 32 35 35  if (buflen > 255
c2c0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c2d0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
c2e0: 2e 20 20 62 75 66 6c 65 6e 20 69 73 20 67 72 65  .  buflen is gre
c2f0: 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 28 62  ater than 255 (b
c300: 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28  uflen = %lu)", (
c310: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
c320: 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72  uflen);....retur
c330: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
c340: 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  slot == NULL) {.
c350: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c360: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73  RINTF("Error.  s
c370: 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  lot is NULL");..
c380: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
c390: 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55  ...if (buf == NU
c3a0: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
c3b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
c3c0: 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c  or.  buf is NULL
c3d0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
c3e0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62  );..}...if (outb
c3f0: 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
c400: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c410: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74  NTF("Error.  out
c420: 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  buf is NULL");..
c430: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
c440: 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20  ...if (identity 
c450: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
c460: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c470: 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
c480: 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  ty is NULL");...
c490: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
c4a0: 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
c4b0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d  pcsc_identity ==
c4c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
c4d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c4e0: 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
c4f0: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
c500: 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
c510: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f  turn(-1);..}.../
c520: 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 64 65 6e  * Determine iden
c530: 74 69 74 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f  tity Key size */
c540: 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
c550: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
c560: 65 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09  eysize < 0) {...
c570: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
c580: 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
c590: 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69   = x509_to_keysi
c5a0: 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  ze(identity->pcs
c5b0: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
c5c0: 69 66 69 63 61 74 65 2c 20 69 64 65 6e 74 69 74  ificate, identit
c5d0: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
c5e0: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
c5f0: 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20  n);..}.../* Pad 
c600: 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 79 20 73  message to key s
c610: 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61 64 49  ize */..if (padI
c620: 6e 70 75 74 29 20 7b 0a 09 09 69 66 20 28 69 64  nput) {...if (id
c630: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
c640: 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e  ntity->keysize >
c650: 20 30 29 20 7b 0a 09 09 09 69 66 20 28 62 75 66   0) {....if (buf
c660: 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d  len != identity-
c670: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
c680: 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 09 69  keysize) {.....i
c690: 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65  f (buflen > (ide
c6a0: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
c6b0: 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20  tity->keysize + 
c6c0: 33 29 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  3)) {......CACKE
c6d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c6e0: 45 72 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20  Error.  Message 
c6f0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20  is too large to 
c700: 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a  sign/decrypt");.
c710: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
c720: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70  ;.....}......tmp
c730: 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74  buflen = identit
c740: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
c750: 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09 74  ->keysize;.....t
c760: 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74  mpbuf = malloc(t
c770: 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66  mpbuflen);.....f
c780: 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a  ree_tmpbuf = 1;.
c790: 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d  .....padlen = tm
c7a0: 70 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e  pbuflen - buflen
c7b0: 20 2d 20 33 3b 0a 0a 09 09 09 09 74 6d 70 62 75   - 3;......tmpbu
c7c0: 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09  f[0] = 0x00;....
c7d0: 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30  .tmpbuf[1] = 0x0
c7e0: 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74  1;.....memset(&t
c7f0: 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20  mpbuf[2], 0xFF, 
c800: 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70  padlen);.....tmp
c810: 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d  buf[padlen + 2]=
c820: 20 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70   0x00;.....memcp
c830: 79 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e  y(&tmpbuf[padlen
c840: 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c   + 3], buf, bufl
c850: 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  en);......CACKEY
c860: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
c870: 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66  "Unpadded:", buf
c880: 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43  , buflen);.....C
c890: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c8a0: 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20  TBUF("Padded:", 
c8b0: 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65  tmpbuf, tmpbufle
c8c0: 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  n);....} else {.
c8d0: 09 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  ....tmpbuf = buf
c8e0: 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ;.....tmpbuflen 
c8f0: 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72  = buflen;.....fr
c900: 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
c910: 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
c920: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
c930: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c940: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
c950: 20 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73   determine key s
c960: 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20  ize, hoping the 
c970: 6d 65 73 73 61 67 65 20 69 73 20 70 72 6f 70 65  message is prope
c980: 72 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a  rly padded!");..
c990: 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
c9a0: 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
c9b0: 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f  buflen;....free_
c9c0: 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70  tmpbuf = 0;....p
c9d0: 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09  adlen = 0;...}..
c9e0: 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75  } else {...tmpbu
c9f0: 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75  f = buf;...tmpbu
ca00: 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09  flen = buflen;..
ca10: 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
ca20: 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ;...padlen = 0;.
ca30: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72  .}.../* Begin tr
ca40: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
ca50: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
ca60: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
ca70: 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63  /* Select correc
ca80: 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 43 41 43  t applet */..CAC
ca90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
caa0: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
cab0: 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e  et found at %p .
cac0: 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ..", identity->p
cad0: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70  csc_identity->ap
cae0: 70 6c 65 74 29 3b 0a 09 63 61 63 6b 65 79 5f 73  plet);..cackey_s
caf0: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
cb00: 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  t, identity->pcs
cb10: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c  c_identity->appl
cb20: 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74  et, sizeof(ident
cb30: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
cb40: 74 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09  ty->applet));...
cb50: 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63  /* Select correc
cb60: 74 20 66 69 6c 65 20 2a 2f 0a 09 63 61 63 6b 65  t file */..cacke
cb70: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c  y_select_file(sl
cb80: 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
cb90: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c  sc_identity->fil
cba0: 65 29 3b 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d  e);...tmpbuf_s =
cbb0: 20 74 6d 70 62 75 66 3b 0a 09 77 68 69 6c 65 20   tmpbuf;..while 
cbc0: 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09  (tmpbuflen) {...
cbd0: 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
cbe0: 32 34 35 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  245) {....bytes_
cbf0: 74 6f 5f 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09  to_send = 245;..
cc00: 09 09 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09  ..p1 = 0x80;....
cc10: 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65  le = 0x00;...} e
cc20: 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  lse {....bytes_t
cc30: 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c  o_send = tmpbufl
cc40: 65 6e 3b 0a 09 09 09 70 31 20 3d 20 30 78 30 30  en;....p1 = 0x00
cc50: 3b 0a 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  ;....le = 0x00;.
cc60: 09 09 7d 0a 0a 09 09 74 6d 70 6f 75 74 62 75 66  ..}....tmpoutbuf
cc70: 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b  len = outbuflen;
cc80: 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
cc90: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
cca0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
ccb0: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
ccc0: 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  M, GSCIS_INSTR_S
ccd0: 49 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20  IGNDECRYPT, p1, 
cce0: 30 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73  0x00, bytes_to_s
ccf0: 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c  end, tmpbuf, le,
cd00: 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62   &respcode, outb
cd10: 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65  uf, &tmpoutbufle
cd20: 6e 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  n);...if (send_r
cd30: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
cd40: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
cd50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cd60: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46  ("ADPU Sending F
cd70: 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69  ailed -- returni
cd80: 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a  ng in error.");.
cd90: 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65  ....if (respcode
cda0: 20 3d 3d 20 30 78 36 39 38 32 29 20 7b 0a 09 09   == 0x6982) {...
cdb0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cdc0: 52 49 4e 54 46 28 22 53 65 63 75 72 69 74 79 20  RINTF("Security 
cdd0: 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73  status not satis
cde0: 69 66 69 65 64 2e 22 29 3b 0a 09 09 09 7d 0a 0a  ified.");....}..
cdf0: 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62  ...if (free_tmpb
ce00: 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28 74 6d  uf) {.....if (tm
ce10: 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 09 66  pbuf_s) {......f
ce20: 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09  ree(tmpbuf_s);..
ce30: 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  ...}....}...../*
ce40: 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   End transaction
ce50: 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e   */....cackey_en
ce60: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
ce70: 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ot);.....return(
ce80: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62  -1);...}....tmpb
ce90: 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73  uf += bytes_to_s
cea0: 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e  end;...tmpbuflen
ceb0: 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e   -= bytes_to_sen
cec0: 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20  d;....outbuf += 
ced0: 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09  tmpoutbuflen;...
cee0: 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70  outbuflen -= tmp
cef0: 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74  outbuflen;...ret
cf00: 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66  val += tmpoutbuf
cf10: 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72  len;..}...if (fr
cf20: 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69  ee_tmpbuf) {...i
cf30: 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09  f (tmpbuf_s) {..
cf40: 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29  ..free(tmpbuf_s)
cf50: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  ;...}..}.../* En
cf60: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d transaction */
cf70: 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
cf80: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
cf90: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
cfa0: 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66  ARANOID.#  ifdef
cfb0: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
cfc0: 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e  X..if (outbuflen
cfd0: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
cfe0: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
cff0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75  DEBUG_PRINTF("Ou
d000: 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20  tbuflen exceeds 
d010: 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72  maximum value, r
d020: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d030: 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c  ure. (max = %li,
d040: 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75   outbuflen = %lu
d050: 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49  )", (long) _POSI
d060: 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e  X_SSIZE_MAX, (un
d070: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74  signed long) out
d080: 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  buflen);....retu
d090: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
d0a0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  dif.#endif.../* 
d0b0: 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09  Unpad reply */..
d0c0: 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74 29  if (unpadOutput)
d0d0: 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c 20   {...if (retval 
d0e0: 3c 20 32 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  < 2) {....CACKEY
d0f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
d100: 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c  eply is too smal
d110: 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61 62  l, we are not ab
d120: 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70  le to unpad -- p
d130: 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20  assing back and 
d140: 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62  hoping for the b
d150: 65 73 74 21 22 29 3b 0a 0a 09 09 09 72 65 74 75  est!");.....retu
d160: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a  rn(retval);...}.
d170: 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f  ...blocktype = o
d180: 75 74 62 75 66 5b 30 5d 3b 0a 09 09 75 6e 70 61  utbuf[0];...unpa
d190: 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09  doffset = 0;....
d1a0: 73 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70  switch (blocktyp
d1b0: 65 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30  e) {....case 0x0
d1c0: 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e  0:...../* Paddin
d1d0: 67 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20  g Scheme 1, the 
d1e0: 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62  first non-zero b
d1f0: 79 74 65 20 69 73 20 74 68 65 20 73 74 61 72 74  yte is the start
d200: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09   of data */.....
d210: 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74  for (unpadoffset
d220: 20 3d 20 31 3b 20 75 6e 70 61 64 6f 66 66 73 65   = 1; unpadoffse
d230: 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61  t < retval; unpa
d240: 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09  doffset++) {....
d250: 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
d260: 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30  adoffset] != 0x0
d270: 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  0) {.......break
d280: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
d290: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
d2a0: 65 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50  e 0x01:...../* P
d2b0: 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c  adding Scheme 2,
d2c0: 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20 30   pad bytes are 0
d2d0: 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  xFF followed by 
d2e0: 30 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20  0x00 */.....for 
d2f0: 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 31  (unpadoffset = 1
d300: 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20  ; unpadoffset < 
d310: 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66  retval; unpadoff
d320: 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  set++) {......if
d330: 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
d340: 66 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b  fset] != 0xFF) {
d350: 0a 09 09 09 09 09 09 69 66 20 28 6f 75 74 62 75  .......if (outbu
d360: 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d  f[unpadoffset] =
d370: 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09  = 0x00) {.......
d380: 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a  .unpadoffset++;.
d390: 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
d3a0: 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
d3b0: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
d3c0: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
d3d0: 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66  d padding data f
d3e0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  ound, returning 
d3f0: 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75  in failure, shou
d400: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 30  ld have been 0x0
d410: 30 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c  0 found 0x%02x",
d420: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
d430: 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
d440: 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65  et]);.........re
d450: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09  turn(-1);.......
d460: 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  }......} else {.
d470: 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
d480: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
d490: 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20  id padding data 
d4a0: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67  found, returning
d4b0: 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f   in failure, sho
d4c0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78  uld have been 0x
d4d0: 46 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22  FF found 0x%02x"
d4e0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
d4f0: 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66   outbuf[unpadoff
d500: 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65  set]);........re
d510: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d  turn(-1);......}
d520: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
d530: 3b 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a  ;....case 0x02:.
d540: 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53  ..../* Padding S
d550: 63 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74  cheme 3, pad byt
d560: 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20  es are non-zero 
d570: 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62  first non-zero b
d580: 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65  yte found is the
d590: 20 70 61 64 20 62 79 74 65 20 2a 2f 0a 09 09 09   pad byte */....
d5a0: 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
d5b0: 74 20 3d 20 31 3b 20 75 6e 70 61 64 6f 66 66 73  t = 1; unpadoffs
d5c0: 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
d5d0: 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
d5e0: 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
d5f0: 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78  padoffset] == 0x
d600: 30 30 29 20 7b 0a 09 09 09 09 09 09 63 6f 6e 74  00) {.......cont
d610: 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  inue;......}....
d620: 09 09 09 69 66 20 28 73 65 70 42 79 74 65 20 3d  ...if (sepByte =
d630: 3d 20 2d 31 29 20 7b 0a 09 09 09 09 09 09 73 65  = -1) {.......se
d640: 70 42 79 74 65 20 3d 20 6f 75 74 62 75 66 5b 75  pByte = outbuf[u
d650: 6e 70 61 64 6f 66 66 73 65 74 5d 3b 0a 0a 09 09  npadoffset];....
d660: 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
d670: 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 6f  ...}.......if (o
d680: 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
d690: 74 5d 20 3d 3d 20 73 65 70 42 79 74 65 29 20 7b  t] == sepByte) {
d6a0: 0a 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73  .......unpadoffs
d6b0: 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65  et++;........bre
d6c0: 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ak;......}.....}
d6d0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
d6e0: 0a 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73  ...if (unpadoffs
d6f0: 65 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09  et > retval) {..
d700: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d710: 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72  RINTF("Offset gr
d720: 65 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79  eater than reply
d730: 20 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e   size, aborting.
d740: 20 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d    (unpadoffset =
d750: 20 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25   %lu, retval = %
d760: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
d770: 6c 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65  long) unpadoffse
d780: 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  t, (unsigned lon
d790: 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  g) retval);.....
d7a0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
d7b0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d7c0: 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64  PRINTBUF("Padded
d7d0: 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76  :", outbuf, retv
d7e0: 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d  al);....retval -
d7f0: 3d 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09  = unpadoffset;..
d800: 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 20  .memmove(outbuf 
d810: 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 6f  + unpadoffset, o
d820: 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a  utbuf, retval);.
d830: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d840: 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64  PRINTBUF("Unpadd
d850: 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65  ed:", outbuf, re
d860: 74 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43  tval);..}....CAC
d870: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d880: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
d890: 75 63 63 65 73 73 2c 20 73 69 67 6e 65 64 20 25  uccess, signed %
d8a0: 6c 69 20 62 79 74 65 73 22 2c 20 28 6c 6f 6e 67  li bytes", (long
d8b0: 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
d8c0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
d8d0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
d8e0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
d8f0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
d900: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
d910: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
d920: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
d930: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
d940: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
d950: 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  et cackey_login(
d960: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
d970: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
d980: 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e  ed char *pin, un
d990: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f  signed long pin_
d9a0: 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f  len, int *tries_
d9b0: 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
d9c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61  unsigned char ca
d9d0: 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46  c_pin[8] = {0xFF
d9e0: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
d9f0: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
da00: 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69  0xFF, 0xFF};..ui
da10: 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f  nt16_t response_
da20: 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73  code;..int tries
da30: 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74  _remaining;..int
da40: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20   send_ret;.../* 
da50: 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65  Indicate that we
da60: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f   do not know abo
da70: 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65  ut how many trie
da80: 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20  s are remaining 
da90: 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65  */..if (tries_re
daa0: 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a  maining_p) {...*
dab0: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
dac0: 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20  p = -1;..}.../* 
dad0: 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20  Apparently, CAC 
dae0: 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c  PINs are *EXACTL
daf0: 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20  Y* 8 bytes long 
db00: 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46  -- pad with 0xFF
db10: 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f   if too short */
db20: 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d  ..if (pin_len >=
db30: 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63   8) {...memcpy(c
db40: 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b  ac_pin, pin, 8);
db50: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d  ..} else {...mem
db60: 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e  cpy(cac_pin, pin
db70: 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a  , pin_len);..}..
db80: 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65  ./* Issue PIN Ve
db90: 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  rify */..send_re
dba0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
dbb0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
dbc0: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
dbd0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49  GSCIS_INSTR_VERI
dbe0: 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  FY, 0x00, 0x00, 
dbf0: 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c  sizeof(cac_pin),
dc00: 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20   cac_pin, 0x00, 
dc10: 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20  &response_code, 
dc20: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
dc30: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
dc40: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
dc50: 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73  {...if ((respons
dc60: 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29  e_code & 0x63C0)
dc70: 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09   == 0x63C0) {...
dc80: 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  .tries_remaining
dc90: 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64   = (response_cod
dca0: 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41  e & 0xF);.....CA
dcb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
dcc0: 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
dcd0: 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74  ion failed, %i t
dce0: 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c  ries remaining",
dcf0: 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
dd00: 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  );.....if (tries
dd10: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
dd20: 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69  ....*tries_remai
dd30: 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72  ning_p = tries_r
dd40: 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a  emaining;....}..
dd50: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
dd60: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
dd70: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70  ...}....if (resp
dd80: 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36  onse_code == 0x6
dd90: 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  983) {....CACKEY
dda0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
ddb0: 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
ddc0: 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69  failed, device i
ddd0: 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09  s locked");.....
dde0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
ddf0: 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  SC_E_LOCKED);...
de00: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  }....return(CACK
de10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
de20: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
de30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
de40: 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73  N Verification s
de50: 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65  ucceeded");...re
de60: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
de70: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
de80: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
de90: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
dea0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
deb0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
dec0: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
ded0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
dee0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
def0: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
df00: 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
df10: 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  nt(struct cackey
df20: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
df30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 63  unsigned char cc
df40: 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53  c_aid[] = {GSCIS
df50: 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 69 6e 74 20  _AID_CCC};..int 
df60: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 53  send_ret;.../* S
df70: 65 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70  elect the CCC Ap
df80: 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  plet */..send_re
df90: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
dfa0: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
dfb0: 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  cc_aid, sizeof(c
dfc0: 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73  cc_aid));..if (s
dfd0: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
dfe0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
dff0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
e000: 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_S_TOKENABSEN
e010: 54 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  T);..}...return(
e020: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
e030: 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a  KENPRESENT);.}..
e040: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
e050: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
e060: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
e070: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
e080: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
e090: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
e0a0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
e0b0: 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
e0c0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
e0d0: 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74  tity_to_label(st
e0e0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
e0f0: 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
e100: 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ity, unsigned ch
e110: 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75  ar *label_buf, u
e120: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62  nsigned long lab
e130: 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75  el_buf_len) {..u
e140: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72  nsigned long cer
e150: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 63  tificate_len;..c
e160: 68 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b  har *label_asn1;
e170: 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63  ..void *certific
e180: 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72  ate;..int x509_r
e190: 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69  ead_ret;...certi
e1a0: 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
e1b0: 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
e1c0: 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
e1d0: 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
e1e0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
e1f0: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
e200: 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  len < 0) {...ret
e210: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35  urn(-1);..}...x5
e220: 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
e230: 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
e240: 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
e250: 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69  ficate_len, (voi
e260: 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e  d **) &label_asn
e270: 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  1);..if (x509_re
e280: 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
e290: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
e2a0: 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
e2b0: 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
e2c0: 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
e2d0: 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
e2e0: 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
e2f0: 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
e300: 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30   "CN");..if (x50
e310: 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29  9_read_ret <= 0)
e320: 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72   {...x509_read_r
e330: 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f  et = x509_dn_to_
e340: 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e  string(label_asn
e350: 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
e360: 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c  , (char *) label
e370: 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f  _buf, label_buf_
e380: 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69  len, NULL);....i
e390: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
e3a0: 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   <= 0) {....retu
e3b0: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
e3c0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
e3d0: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
e3e0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
e3f0: 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
e400: 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  ret > _POSIX_SSI
e410: 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
e420: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e430: 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65  "x509_read_ret e
e440: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
e450: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
e460: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
e470: 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61   = %li, x509_rea
e480: 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28  d_ret = %lu)", (
e490: 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49  long) _POSIX_SSI
e4a0: 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65  ZE_MAX, (unsigne
e4b0: 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61  d long) x509_rea
e4c0: 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  d_ret);....retur
e4d0: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
e4e0: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75  if.#endif...retu
e4f0: 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  rn(x509_read_ret
e500: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
e510: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
e520: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
e530: 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
e540: 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a  void **mutex) {.
e550: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
e560: 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
e570: 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
e580: 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
e590: 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
e5a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e5b0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
e5c0: 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
e5d0: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
e5e0: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
e5f0: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
e600: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
e610: 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  tex = malloc(siz
e620: 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74  eof(*pthread_mut
e630: 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68  ex));...if (!pth
e640: 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09  read_mutex) {...
e650: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e660: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
e670: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e  allocate memory.
e680: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
e690: 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65  1);...}....pthre
e6a0: 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
e6b0: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70  ead_mutex_init(p
e6c0: 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55  thread_mutex, NU
e6d0: 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  LL);...if (pthre
e6e0: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
e6f0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
e700: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
e710: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72  d_mutex_init() r
e720: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
e730: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
e740: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
e750: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d  n(-1);...}....*m
e760: 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d  utex = pthread_m
e770: 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  utex;..} else {.
e780: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67  ..if (cackey_arg
e790: 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b  s.CreateMutex) {
e7a0: 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61  ....custom_retva
e7b0: 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e  l = cackey_args.
e7c0: 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65  CreateMutex(mute
e7d0: 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
e7e0: 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
e7f0: 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
e800: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e810: 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
e820: 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  teMutex() return
e830: 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
e840: 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
e850: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
e860: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
e870: 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
e880: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
e890: 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
e8a0: 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
e8b0: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  rn(0);.}../* Ret
e8c0: 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
e8d0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
e8e0: 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
e8f0: 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b  k(void *mutex) {
e900: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
e910: 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
e920: 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
e930: 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
e940: 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
e950: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e960: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
e970: 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
e980: 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
e990: 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
e9a0: 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
e9b0: 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
e9c0: 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09  utex = mutex;...
e9d0: 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
e9e0: 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
e9f0: 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74  lock(pthread_mut
ea00: 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  ex);...if (pthre
ea10: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
ea20: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
ea30: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
ea40: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72  d_mutex_lock() r
ea50: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
ea60: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
ea70: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
ea80: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n(-1);...}..} el
ea90: 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
eaa0: 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
eab0: 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
eac0: 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
ead0: 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74  gs.LockMutex(mut
eae0: 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
eaf0: 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
eb00: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
eb10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
eb20: 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  "cackey_args.Loc
eb30: 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  kMutex() returne
eb40: 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
eb50: 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
eb60: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
eb70: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
eb80: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
eb90: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
eba0: 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
ebb0: 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
ebc0: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  n(0);.}../* Retu
ebd0: 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
ebe0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
ebf0: 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
ec00: 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20  ck(void *mutex) 
ec10: 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
ec20: 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
ec30: 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
ec40: 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
ec50: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
ec60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ec70: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
ec80: 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
ec90: 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
eca0: 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
ecb0: 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
ecc0: 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
ecd0: 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a  mutex = mutex;..
ece0: 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
ecf0: 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
ed00: 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  _unlock(pthread_
ed10: 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
ed20: 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
ed30: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
ed40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
ed50: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
ed60: 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  k() returned err
ed70: 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
ed80: 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
ed90: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
eda0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
edb0: 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
edc0: 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  ckMutex) {....cu
edd0: 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
ede0: 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
edf0: 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
ee00: 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
ee10: 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
ee20: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
ee30: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
ee40: 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
ee50: 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
ee60: 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
ee70: 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
ee80: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
ee90: 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
eea0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
eeb0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
eec0: 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
eed0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
eee0: 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54  .}..static CK_AT
eef0: 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b  TRIBUTE_PTR cack
ef00: 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
ef10: 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  s(CK_OBJECT_CLAS
ef20: 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73  S objectclass, s
ef30: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
ef40: 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
ef50: 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c  tity, unsigned l
ef60: 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ong identity_num
ef70: 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
ef80: 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74  ulCount) {..stat
ef90: 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74  ic CK_BBOOL ck_t
efa0: 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63  rue = 1;..static
efb0: 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c   CK_BBOOL ck_fal
efc0: 73 65 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e  se = 0;..CK_ULON
efd0: 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20  G numattrs = 0, 
efe0: 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43  retval_count;..C
eff0: 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  K_ATTRIBUTE_TYPE
f000: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
f010: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63  ..CK_ATTRIBUTE c
f020: 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61  urr_attr, *retva
f030: 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  l;..CK_VOID_PTR 
f040: 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
f050: 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43  G ulValueLen;..C
f060: 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63  K_OBJECT_CLASS c
f070: 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
f080: 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  .CK_CERTIFICATE_
f090: 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63  TYPE ck_certific
f0a0: 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45  ate_type;..CK_KE
f0b0: 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79  Y_TYPE ck_key_ty
f0c0: 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52  pe;..CK_UTF8CHAR
f0d0: 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b   ucTmpBuf[1024];
f0e0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
f0f0: 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73  *certificate;..s
f100: 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61  size_t certifica
f110: 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30  te_len = -1, x50
f120: 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74  9_read_ret;..int
f130: 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09   pValue_free;...
f140: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f150: 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a  NTF("Called (obj
f160: 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20  ectClass = %lu, 
f170: 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25  identity_num = %
f180: 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
f190: 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61   long) objectcla
f1a0: 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ss, identity_num
f1b0: 29 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63  );...if (objectc
f1c0: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
f1d0: 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
f1e0: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55  tclass != CKO_PU
f1f0: 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65  BLIC_KEY && obje
f200: 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
f210: 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
f220: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f230: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
f240: 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
f250: 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20   invalid object 
f260: 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75  class");....retu
f270: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
f280: 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69  * Get Cert */..i
f290: 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
f2a0: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
f2b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f2c0: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
f2d0: 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69  s (NULL), invali
f2e0: 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64  d identiy provid
f2f0: 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ed");....return(
f300: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74  NULL);..}...cert
f310: 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69  ificate = identi
f320: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b  ty->certificate;
f330: 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ..certificate_le
f340: 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  n = identity->ce
f350: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
f360: 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
f370: 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65  _len == -1 || ce
f380: 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c  rtificate == NUL
f390: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
f3a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
f3b0: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
f3c0: 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65  (NULL), this ide
f3d0: 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68  ntity does not h
f3e0: 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72  ave an X.509 cer
f3f0: 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61  tificate associa
f400: 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20  ted with it and 
f410: 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b  will not work");
f420: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
f430: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
f440: 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74   that certificat
f450: 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64  e is ASN.1 encod
f460: 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  ed X.509 certifi
f470: 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30  cate */..if (x50
f480: 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74  9_to_serial(cert
f490: 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
f4a0: 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20  cate_len, NULL) 
f4b0: 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 0) {...CACKEY_
f4c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f4d0: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
f4e0: 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e  s (NULL), the X.
f4f0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
f500: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f510: 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73  this identity is
f520: 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09   not valid");...
f530: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
f540: 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74  }...retval_count
f550: 20 3d 20 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d   = 16;..retval =
f560: 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63   malloc(retval_c
f570: 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72  ount * sizeof(*r
f580: 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28  etval));...for (
f590: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
f5a0: 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79   0; curr_attr_ty
f5b0: 70 65 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b  pe < 0xce53635f;
f5c0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b   curr_attr_type+
f5d0: 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f  +) {...if (curr_
f5e0: 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38  attr_type == 0x8
f5f0: 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74  00) {....curr_at
f600: 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33  tr_type = 0xce53
f610: 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61  6300;...}....pVa
f620: 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09  lue_free = 0;...
f630: 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
f640: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
f650: 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73  K_LONG) -1;....s
f660: 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72  witch (curr_attr
f670: 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  _type) {....case
f680: 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09   CKA_CLASS:.....
f690: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f6a0: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
f6b0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c  attribute CKA_CL
f6c0: 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASS (0x%08lx) ..
f6d0: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
f6e0: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
f6f0: 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a  pe);......ck_obj
f700: 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65  ect_class = obje
f710: 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56  ctclass;......pV
f720: 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63  alue = &ck_objec
f730: 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56  t_class;.....ulV
f740: 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
f750: 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  (ck_object_class
f760: 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
f770: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
f780: 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
f790: 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
f7a0: 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
f7b0: 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29  _OBJECT_CLASS *)
f7c0: 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
f7d0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
f7e0: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
f7f0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
f800: 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09  se CKA_TOKEN:...
f810: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f820: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
f830: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
f840: 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20  TOKEN (0x%08lx) 
f850: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
f860: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
f870: 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
f880: 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
f890: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
f8a0: 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
f8b0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
f8c0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
f8d0: 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
f8e0: 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
f8f0: 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
f900: 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
f910: 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
f920: 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
f930: 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
f940: 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
f950: 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41  DIFIABLE:.....CA
f960: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f970: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
f980: 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49  tribute CKA_MODI
f990: 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29  FIABLE (0x%08lx)
f9a0: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
f9b0: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
f9c0: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
f9d0: 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
f9e0: 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
f9f0: 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
fa00: 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
fa10: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
fa20: 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
fa30: 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
fa40: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
fa50: 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
fa60: 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
fa70: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
fa80: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
fa90: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
faa0: 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b  _LABEL:.....CACK
fab0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fac0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
fad0: 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20  ibute CKA_LABEL 
fae0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
faf0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
fb00: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
fb10: 0a 0a 09 09 09 09 2f 2a 20 44 65 74 65 72 6d 69  ....../* Determi
fb20: 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 78  ne name */.....x
fb30: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 63  509_read_ret = c
fb40: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
fb50: 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 69 64 65  ity_to_label(ide
fb60: 6e 74 69 74 79 2c 20 75 63 54 6d 70 42 75 66 2c  ntity, ucTmpBuf,
fb70: 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66   sizeof(ucTmpBuf
fb80: 29 29 3b 0a 09 09 09 09 69 66 20 28 78 35 30 39  ));.....if (x509
fb90: 5f 72 65 61 64 5f 72 65 74 20 3e 20 30 29 20 7b  _read_ret > 0) {
fba0: 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75  ......pValue = u
fbb0: 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 09 75 6c  cTmpBuf;......ul
fbc0: 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
fbd0: 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 7d 0a  read_ret;.....}.
fbe0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
fbf0: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
fc00: 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
fc10: 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
fc20: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
fc30: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
fc40: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
fc50: 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b  _VALUE:.....CACK
fc60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fc70: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
fc80: 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20  ibute CKA_VALUE 
fc90: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
fca0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
fcb0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
fcc0: 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62  ......switch (ob
fcd0: 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09  jectclass) {....
fce0: 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41  ..case CKO_PRIVA
fcf0: 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41  TE_KEY:.......CA
fd00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fd10: 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
fd20: 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
fd30: 73 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76  se we are a priv
fd40: 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09  ate key.");.....
fd50: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
fd60: 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b  ase CKO_PUBLIC_K
fd70: 45 59 3a 0a 09 09 09 09 09 09 2f 2a 20 58 58 58  EY:......./* XXX
fd80: 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09 09 09  : TODO */.......
fd90: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
fda0: 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  e CKO_CERTIFICAT
fdb0: 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20  E:.......pValue 
fdc0: 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  = certificate;..
fdd0: 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
fde0: 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  = certificate_le
fdf0: 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  n;........break;
fe00: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
fe10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fe20: 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
fe30: 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
fe40: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
fe50: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
fe60: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
fe70: 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09  e CKA_ISSUER:...
fe80: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
fe90: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
fea0: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
feb0: 49 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29  ISSUER (0x%08lx)
fec0: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
fed0: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
fee0: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
fef0: 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
ff00: 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
ff10: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
ff20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
ff30: 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
ff40: 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
ff50: 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
ff60: 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09  icate.");.......
ff70: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
ff80: 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
ff90: 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
ffa0: 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
ffb0: 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65   = x509_to_issue
ffc0: 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  r(certificate, c
ffd0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
ffe0: 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
fff0: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
10000 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
10010 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
10020 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
10030 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
10040 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
10050 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
10060 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10070 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
10080 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
10090 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
100a0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
100b0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
100c0 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  case CKA_SERIAL_
100d0 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b  NUMBER:.....CACK
100e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
100f0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
10100 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c  ibute CKA_SERIAL
10110 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78  _NUMBER (0x%08lx
10120 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
10130 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
10140 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
10150 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
10160 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
10170 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
10180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
10190 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
101a0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
101b0 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
101c0 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09  ficate.");......
101d0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
101e0 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
101f0 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
10200 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
10210 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69  t = x509_to_seri
10220 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
10230 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
10240 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
10250 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
10260 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
10270 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
10280 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
10290 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
102a0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
102b0 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
102c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
102d0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
102e0 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
102f0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
10300 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
10310 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
10320 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a  ...case CKA_SUBJ
10330 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ECT:.....CACKEY_
10340 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10350 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
10360 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28  te CKA_SUBJECT (
10370 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
10380 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
10390 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
103a0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
103b0 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
103c0 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09  IFICATE) {......
103d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
103e0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
103f0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
10400 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
10410 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29  a certificate.")
10420 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
10430 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
10440 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
10450 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
10460 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
10470 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69  to_subject(certi
10480 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
10490 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
104a0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
104b0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
104c0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
104d0 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
104e0 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
104f0 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
10500 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
10510 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
10520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
10530 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
10540 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
10550 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
10560 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
10570 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
10580 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59  A_ID:.....CACKEY
10590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
105a0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
105b0 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30  ute CKA_ID (0x%0
105c0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
105d0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
105e0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
105f0 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28  .ucTmpBuf[0] = (
10600 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20  (identity_num + 
10610 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  1) >> 8) & 0xff;
10620 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d  .....ucTmpBuf[1]
10630 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75   =  (identity_nu
10640 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a  m + 1) & 0xff;..
10650 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63  ....pValue = &uc
10660 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61  TmpBuf;.....ulVa
10670 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09  lueLen = 2;.....
10680 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10690 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
106a0 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
106b0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
106c0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
106d0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
106e0 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49  ..case CKA_CERTI
106f0 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09  FICATE_TYPE:....
10700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10710 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
10720 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
10730 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
10740 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
10750 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10760 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
10770 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
10780 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
10790 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
107a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
107b0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
107c0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
107d0 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
107e0 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22   a certificate."
107f0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
10800 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
10810 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e   only support on
10820 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 79  e certificate ty
10830 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72  pe */.....ck_cer
10840 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20  tificate_type = 
10850 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09  CKC_X_509;......
10860 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72  pValue = &ck_cer
10870 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09  tificate_type;..
10880 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
10890 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66  sizeof(ck_certif
108a0 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09  icate_type);....
108b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
108c0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
108d0 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20  rning CKC_X_509 
108e0 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c  (%lu) (%p/%lu)",
108f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
10900 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41   *((CK_CERTIFICA
10910 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75  TE_TYPE *) pValu
10920 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
10930 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
10940 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
10950 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
10960 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43  _KEY_TYPE:.....C
10970 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10980 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
10990 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59  ttribute CKA_KEY
109a0 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20  _TYPE (0x%08lx) 
109b0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
109c0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
109d0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
109e0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
109f0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26  KO_PRIVATE_KEY &
10a00 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
10a10 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29   CKO_PUBLIC_KEY)
10a20 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
10a30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
10a40 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
10a50 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
10a60 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29  are not a key.")
10a70 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
10a80 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20  ...}....../* We 
10a90 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65  only support one
10aa0 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09   key type */....
10ab0 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43  .ck_key_type = C
10ac0 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61  KK_RSA;......pVa
10ad0 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79  lue = &ck_key_ty
10ae0 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  pe;.....ulValueL
10af0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b  en = sizeof(ck_k
10b00 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43  ey_type);......C
10b10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10b20 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
10b30 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29  ng CKK_RSA (%lu)
10b40 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
10b50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
10b60 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
10b70 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  PE *) pValue), p
10b80 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
10b90 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
10ba0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
10bb0 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
10bc0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
10bd0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
10be0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
10bf0 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c  CKA_SIGN (0x%08l
10c00 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
10c10 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
10c20 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
10c30 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
10c40 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
10c50 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
10c60 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
10c70 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
10c80 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
10c90 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
10ca0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
10cb0 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
10cc0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
10cd0 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
10ce0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10cf0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
10d00 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
10d10 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
10d20 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
10d30 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
10d40 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
10d50 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
10d60 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
10d70 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43  ....case CKA_DEC
10d80 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  RYPT:.....CACKEY
10d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
10da0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
10db0 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20  ute CKA_DECRYPT 
10dc0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
10dd0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10de0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
10df0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
10e00 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
10e10 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65  VATE_KEY || obje
10e20 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
10e30 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09  UBLIC_KEY) {....
10e40 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
10e50 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
10e60 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
10e70 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
10e80 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
10e90 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
10ea0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
10eb0 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
10ec0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
10ed0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10ee0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
10ef0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
10f00 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10f10 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
10f20 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
10f30 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10f40 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
10f50 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
10f60 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45   CKA_TRUST_SERVE
10f70 52 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b  R_AUTH:.....CACK
10f80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10f90 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
10fa0 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
10fb0 53 45 52 56 45 52 5f 41 55 54 48 20 28 30 78 25  SERVER_AUTH (0x%
10fc0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
10fd0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
10fe0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
10ff0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
11000 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
11010 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
11020 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
11030 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11040 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
11050 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
11060 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
11070 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
11080 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
11090 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
110a0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
110b0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
110c0 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54  CKA_TRUST_CLIENT
110d0 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b 45  _AUTH:.....CACKE
110e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
110f0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
11100 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  bute CKA_TRUST_C
11110 4c 49 45 4e 54 5f 41 55 54 48 20 28 30 78 25 30  LIENT_AUTH (0x%0
11120 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
11130 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
11140 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
11150 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
11160 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
11170 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
11180 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
11190 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
111a0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
111b0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
111c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
111d0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
111e0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
111f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
11200 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
11210 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
11220 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49  KA_TRUST_CODE_SI
11230 47 4e 49 4e 47 3a 0a 09 09 09 09 43 41 43 4b 45  GNING:.....CACKE
11240 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11250 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
11260 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  bute CKA_TRUST_C
11270 4f 44 45 5f 53 49 47 4e 49 4e 47 20 28 30 78 25  ODE_SIGNING (0x%
11280 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
11290 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
112a0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
112b0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
112c0 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
112d0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
112e0 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
112f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11300 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
11310 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
11320 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
11330 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
11340 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
11350 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
11360 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
11370 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
11380 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f  CKA_TRUST_EMAIL_
11390 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09  PROTECTION:.....
113a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
113b0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
113c0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
113d0 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43  UST_EMAIL_PROTEC
113e0 54 49 4f 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  TION (0x%08lx) .
113f0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
11400 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
11410 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
11420 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
11430 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
11440 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
11450 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
11460 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
11470 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
11480 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
11490 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
114a0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
114b0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
114c0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
114d0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
114e0 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
114f0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
11500 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
11510 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09   (CK_LONG) -1;..
11520 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
11530 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20  .if (((CK_LONG) 
11540 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28  ulValueLen) != (
11550 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b  (CK_LONG) -1)) {
11560 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72  ..../* Push curr
11570 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73  _attr onto the s
11580 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f  tack */....curr_
11590 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72  attr.type = curr
115a0 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63  _attr_type;....c
115b0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
115c0 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  Len = ulValueLen
115d0 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  ;.....curr_attr.
115e0 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
115f0 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
11600 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79  eLen);....memcpy
11610 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  (curr_attr.pValu
11620 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  e, pValue, curr_
11630 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
11640 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65  ;.....if (pValue
11650 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29  _free && pValue)
11660 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c   {.....free(pVal
11670 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ue);....}.....if
11680 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65   (numattrs >= re
11690 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  tval_count) {...
116a0 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  ..retval_count *
116b0 3d 20 32 3b 0a 09 09 09 09 72 65 74 76 61 6c 20  = 2;.....retval 
116c0 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c  = realloc(retval
116d0 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  , retval_count *
116e0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
116f0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
11700 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74  py(&retval[numat
11710 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72  trs], &curr_attr
11720 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74  , sizeof(curr_at
11730 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72  tr));....numattr
11740 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  s++;...}..}...if
11750 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29   (numattrs != 0)
11760 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e   {...retval_coun
11770 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09  t = numattrs;...
11780 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63  retval = realloc
11790 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f  (retval, retval_
117a0 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
117b0 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73  retval));..} els
117c0 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61  e {...free(retva
117d0 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20  l);....retval = 
117e0 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43  NULL;..}...*pulC
117f0 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
11800 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11810 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
11820 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25  g %lu objects (%
11830 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20  p).", numattrs, 
11840 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
11850 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
11860 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
11870 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
11880 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  (struct cackey_i
11890 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
118a0 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ies, unsigned lo
118b0 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  ng identities_co
118c0 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49  unt) {..CK_ATTRI
118d0 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
118e0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
118f0 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78  id_idx, attr_idx
11900 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69  ;...if (identiti
11910 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64  es == NULL || id
11920 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
11930 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  = 0) {...return;
11940 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64  ..}...for (id_id
11950 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20  x = 0; id_idx < 
11960 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
11970 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  ; id_idx++) {...
11980 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69  if (identities[i
11990 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
119a0 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74  s) {....for (att
119b0 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f  r_idx = 0; attr_
119c0 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73  idx < identities
119d0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
119e0 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f  tes_count; attr_
119f0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72  idx++) {.....cur
11a00 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69  r_attr = &identi
11a10 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
11a20 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78  ributes[attr_idx
11a30 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72  ];......if (curr
11a40 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b  _attr->pValue) {
11a50 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f  ......free(curr_
11a60 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09  attr->pValue);..
11a70 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
11a80 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
11a90 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
11aa0 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e   {.....free(iden
11ab0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
11ac0 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d  ttributes);....}
11ad0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
11ae0 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 69 65  _certs(identitie
11af0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
11b00 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a  dentity, 1, 1);.
11b10 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64  ..}..}...free(id
11b20 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74  entities);.}..st
11b30 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
11b40 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  ey_identity *cac
11b50 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
11b60 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
11b70 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
11b80 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73  signed long *ids
11b90 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63  _found) {..struc
11ba0 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
11bb0 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
11bc0 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74  ntities;..struct
11bd0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
11be0 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
11bf0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
11c00 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75  _ids, id_idx, cu
11c10 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73  rr_id_type;..uns
11c20 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
11c30 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a  erts, cert_idx;.
11c40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11c50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
11c60 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e  ;...if (ids_foun
11c70 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d == NULL) {...C
11c80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11c90 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f  TF("Error.  ids_
11ca0 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b  found is NULL");
11cb0 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
11cc0 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e  ;..}...pcsc_iden
11cd0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
11ce0 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c  read_certs(slot,
11cf0 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
11d00 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64  s);..if (pcsc_id
11d10 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
11d20 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74  ) {.../* Convert
11d30 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73   number of Certs
11d40 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62   to number of ob
11d50 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69  jects */...num_i
11d60 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54  ds = (CKO_PRIVAT
11d70 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54  E_KEY - CKO_CERT
11d80 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e  IFICATE + 1) * n
11d90 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 64 65  um_certs;....ide
11da0 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63  ntities = malloc
11db0 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f  (num_ids * sizeo
11dc0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b  f(*identities));
11dd0 0a 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a  ....id_idx = 0;.
11de0 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20  ..for (cert_idx 
11df0 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20  = 0; cert_idx < 
11e00 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f  num_certs; cert_
11e10 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20  idx++) {....for 
11e20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20  (curr_id_type = 
11e30 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b  CKO_CERTIFICATE;
11e40 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d   curr_id_type <=
11e50 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
11e60 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b  ; curr_id_type++
11e70 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69  ) {.....identiti
11e80 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
11e90 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
11ea0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63 75  et_attributes(cu
11eb0 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73  rr_id_type, &pcs
11ec0 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
11ed0 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78  t_idx], cert_idx
11ee0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
11ef0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
11f00 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 66  _count);......if
11f10 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
11f20 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
11f30 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  == NULL) {......
11f40 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
11f50 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
11f60 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09 7d 0a 0a  unt = 0;.....}..
11f70 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
11f80 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
11f90 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
11fa0 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
11fb0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
11fc0 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d 65  entity));.....me
11fd0 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
11fe0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
11ff0 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64 65  ntity, &pcsc_ide
12000 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
12010 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74  ], sizeof(*ident
12020 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
12030 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a  sc_identity));..
12040 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
12050 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
12060 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
12070 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f  e = malloc(pcsc_
12080 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
12090 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
120a0 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
120b0 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
120c0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
120d0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
120e0 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
120f0 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
12100 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
12110 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
12120 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
12130 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b  n);......id_idx+
12140 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  +;....}...}....c
12150 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
12160 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
12170 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
12180 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d  ....*ids_found =
12190 20 6e 75 6d 5f 69 64 73 3b 0a 09 09 72 65 74 75   num_ids;...retu
121a0 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a  rn(identities);.
121b0 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20  .}...*ids_found 
121c0 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c  = 0;..return(NUL
121d0 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  L);.}..CK_DEFINE
121e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
121f0 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43   C_Initialize)(C
12200 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74  K_VOID_PTR pInit
12210 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e  Args) {..CK_C_IN
12220 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b  ITIALIZE_ARGS CK
12230 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74  _PTR args;..uint
12240 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d  32_t idx;..int m
12250 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a  utex_init_ret;..
12260 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12270 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
12280 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67 73  ...if (pInitArgs
12290 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72   != NULL) {...ar
122a0 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a  gs = pInitArgs;.
122b0 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79  ..memcpy(&cackey
122c0 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a  _args, args, siz
122d0 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29  eof(cackey_args)
122e0 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e  );....if (args->
122f0 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e  CreateMutex == N
12300 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73  ULL || args->Des
12310 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  troyMutex == NUL
12320 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d  L || args->LockM
12330 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
12340 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65  args->UnlockMute
12350 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  x == NULL) {....
12360 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65  if (args->Create
12370 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
12380 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75   args->DestroyMu
12390 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
123a0 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21  rgs->LockMutex !
123b0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
123c0 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e  UnlockMutex != N
123d0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
123e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
123f0 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74  Error. Some, but
12400 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69   not All threadi
12410 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72  ng primitives pr
12420 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09  ovided.");......
12430 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
12440 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a  ENTS_BAD);....}.
12450 09 09 7d 0a 0a 09 09 69 66 20 28 61 72 67 73 2d  ..}....if (args-
12460 3e 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  >pReserved != NU
12470 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
12480 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
12490 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69  ror. pReserved i
124a0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
124b0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
124c0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
124d0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  }..} else {...ca
124e0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
124f0 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
12500 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74  cackey_args.Dest
12510 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  royMutex = NULL;
12520 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  ...cackey_args.L
12530 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
12540 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  ...cackey_args.U
12550 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c  nlockMutex = NUL
12560 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
12570 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  .flags = 0;..}..
12580 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74  .if (cackey_init
12590 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
125a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
125b0 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64  ("Error.  Alread
125c0 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  y initialized.")
125d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
125e0 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59  CRYPTOKI_ALREADY
125f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
12600 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
12610 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
12620 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
12630 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
12640 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
12650 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
12660 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
12670 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
12680 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
12690 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
126a0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
126b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
126c0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
126d0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
126e0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
126f0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
12700 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  dx].pcsc_reader 
12710 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
12720 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
12730 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
12740 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
12750 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
12760 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b  t = 0;..}...cack
12770 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
12780 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65   1;...if (!cacke
12790 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20  y_biglock_init) 
127a0 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72  {...mutex_init_r
127b0 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  et = cackey_mute
127c0 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79  x_create(&cackey
127d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
127e0 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74   (mutex_init_ret
127f0 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
12800 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12810 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69  "Error.  Mutex i
12820 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
12830 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  iled.");.....ret
12840 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43  urn(CKR_CANT_LOC
12850 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  K);...}....cacke
12860 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
12870 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f   1;..}...CACKEY_
12880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
12890 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
128a0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
128b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
128c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
128d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
128e0 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  Finalize)(CK_VOI
128f0 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
12900 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
12910 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
12920 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
12930 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
12940 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
12950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12960 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
12970 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
12980 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
12990 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
129a0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
129b0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
129c0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
129d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
129e0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
129f0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
12a00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
12a10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
12a20 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
12a30 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
12a40 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
12a50 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
12a60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
12a70 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
12a80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
12a90 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
12aa0 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
12ab0 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  n(idx);...}..}..
12ac0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
12ad0 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
12ae0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
12af0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
12b00 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
12b10 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
12b20 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
12b30 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
12b40 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65  ots[idx].pcsc_re
12b50 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28  ader) {....free(
12b60 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
12b70 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ].pcsc_reader);.
12b80 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  ..}..}...cackey_
12b90 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
12ba0 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  );...cackey_init
12bb0 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43  ialized = 0;...C
12bc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12bd0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
12be0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
12bf0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
12c00 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
12c10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
12c20 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43  RV, C_GetInfo)(C
12c30 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  K_INFO_PTR pInfo
12c40 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
12c50 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74  TF8CHAR manufact
12c60 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e  urerID[] = "U.S.
12c70 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73   Government";..s
12c80 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
12c90 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  R libraryDescrip
12ca0 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
12cb0 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ";...CACKEY_DEBU
12cc0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
12cd0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
12ce0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
12cf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12d00 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
12d10 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
12d20 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
12d30 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
12d40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
12d50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
12d60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12d70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
12d80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
12d90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
12da0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
12db0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  ZED);..}...pInfo
12dc0 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
12dd0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b  n.major = ((CACK
12de0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
12df0 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29  ION_CODE) >> 16)
12e00 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
12e10 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
12e20 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45  .minor = ((CACKE
12e30 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
12e40 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26  ON_CODE) >> 8) &
12e50 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28   0xff;...memset(
12e60 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
12e70 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
12e80 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
12e90 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
12ea0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
12eb0 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
12ec0 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
12ed0 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
12ee0 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
12ef0 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a  >flags = 0x00;..
12f00 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c  .memset(pInfo->l
12f10 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
12f20 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  n, ' ', sizeof(p
12f30 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
12f40 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
12f50 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  cpy(pInfo->libra
12f60 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c  ryDescription, l
12f70 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
12f80 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72  n, sizeof(librar
12f90 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  yDescription) - 
12fa0 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  1);...pInfo->lib
12fb0 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  raryVersion.majo
12fc0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
12fd0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
12fe0 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
12ff0 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d  libraryVersion.m
13000 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
13010 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
13020 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  ) & 0xff;...CACK
13030 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13040 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
13050 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
13060 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
13070 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f  K);.}../*. * Pro
13080 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61  cess list of rea
13090 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65  ders, and create
130a0 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e   mapping between
130b0 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64   reader name and
130c0 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f   slot ID. */.CK_
130d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
130e0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
130f0 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74  List)(CK_BBOOL t
13100 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f  okenPresent, CK_
13110 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f  SLOT_ID_PTR pSlo
13120 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  tList, CK_ULONG_
13130 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
13140 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
13150 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e  l;..int pcsc_con
13160 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c  nect_ret;..CK_UL
13170 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  ONG count, slot_
13180 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73  count = 0, currs
13190 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63  lot;..char *pcsc
131a0 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f  _readers, *pcsc_
131b0 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63  readers_s, *pcsc
131c0 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f  _readers_e;..DWO
131d0 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  RD pcsc_readers_
131e0 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
131f0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
13200 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72  ;..size_t curr_r
13210 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43  eader_len;...CAC
13220 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13230 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
13240 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
13250 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
13260 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
13270 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73  ror. pulCount is
13280 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
13290 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
132a0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
132b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
132c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
132d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
132e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
132f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
13300 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
13310 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
13320 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
13330 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
13340 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
13350 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
13360 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
13370 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
13380 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13390 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
133a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
133b0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
133c0 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65  OR);..}.../* Cle
133d0 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  ar list of slots
133e0 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69   */..if (pSlotLi
133f0 73 74 29 20 7b 0a 09 09 2f 2a 20 4f 6e 6c 79 20  st) {.../* Only 
13400 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
13410 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
13420 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
13430 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  g supply the slo
13440 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
13450 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
13460 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
13470 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c  ;....for (currsl
13480 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
13490 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
134a0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
134b0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
134c0 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
134d0 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79   {....if (cackey
134e0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
134f0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a  .pcsc_reader) {.
13500 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
13510 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
13520 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
13530 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
13540 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
13550 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09  eader = NULL;...
13560 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  .}.....cackey_sl
13570 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
13580 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  tive = 0;...}..}
13590 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
135a0 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20  list of readers 
135b0 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  */..pcsc_connect
135c0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
135d0 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
135e0 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
135f0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
13600 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
13610 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13620 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
13630 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61 73  PC/SC failed, as
13640 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22  suming no slots"
13650 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  );....slot_count
13660 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 0;..} else {.
13670 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  ..pcsc_readers_l
13680 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64  en = 0;....scard
13690 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
136a0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
136b0 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
136c0 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e  _handle, NULL, N
136d0 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ULL, &pcsc_reade
136e0 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73  rs_len);...if (s
136f0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
13700 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
13710 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f  SUCCESS && pcsc_
13720 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30  readers_len != 0
13730 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64  ) {....pcsc_read
13740 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73  ers = malloc(pcs
13750 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
13760 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
13770 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  s = pcsc_readers
13780 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74  ;.....scard_list
13790 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
137a0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
137b0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
137c0 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72  le, NULL, pcsc_r
137d0 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65  eaders, &pcsc_re
137e0 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69  aders_len);....i
137f0 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61  f (scard_listrea
13800 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  ders_ret == SCAR
13810 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
13820 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
13830 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  e = pcsc_readers
13840 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   + pcsc_readers_
13850 6c 65 6e 3b 0a 0a 09 09 09 09 63 75 72 72 73 6c  len;......currsl
13860 6f 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c  ot = 0;.....whil
13870 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20  e (pcsc_readers 
13880 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  < pcsc_readers_e
13890 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 72 65  ) {......curr_re
138a0 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65  ader_len = strle
138b0 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  n(pcsc_readers);
138c0 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73 63  .......if ((pcsc
138d0 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f  _readers + curr_
138e0 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63  reader_len) > pc
138f0 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a  sc_readers_e) {.
13900 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
13910 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
13920 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d  rr_reader_len ==
13930 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61   0) {.......brea
13940 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
13950 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20  if (currslot >= 
13960 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
13970 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
13980 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
13990 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
139a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
139b0 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72  ound more reader
139c0 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65  s than slots are
139d0 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a   available!");..
139e0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
139f0 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59  ..}.......CACKEY
13a00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
13a10 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73 22  ound reader: %s"
13a20 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  , pcsc_readers);
13a30 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75  ......./* Only u
13a40 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f  pdate the list o
13a50 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72  f slots if we ar
13a60 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  e actually being
13a70 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
13a80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
13a90 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69  .....if (pSlotLi
13aa0 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61 63 6b  st) {.......cack
13ab0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
13ac0 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  t].active = 1;..
13ad0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
13ae0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
13af0 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70  _reader = strdup
13b00 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a  (pcsc_readers);.
13b10 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
13b20 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
13b30 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
13b40 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b   = 0;.......cack
13b50 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
13b60 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t].transaction_d
13b70 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09  epth = 0;.......
13b80 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
13b90 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65  rslot].slot_rese
13ba0 74 20 3d 20 31 3b 0a 09 09 09 09 09 7d 0a 09 09  t = 1;......}...
13bb0 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
13bc0 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
13bd0 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
13be0 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
13bf0 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
13c00 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  t > 0) {......sl
13c10 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72 73  ot_count = currs
13c20 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  lot;.....}....} 
13c30 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
13c40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13c50 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53  Second call to S
13c60 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20  CardListReaders 
13c70 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25  failed, return %
13c80 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44  s/%li", CACKEY_D
13c90 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
13ca0 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
13cb0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
13cc0 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c  , (long) scard_l
13cd0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b  istreaders_ret);
13ce0 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70  ....}.....free(p
13cf0 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a  csc_readers_s);.
13d00 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
13d10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13d20 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f  F("First call to
13d30 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
13d40 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
13d50 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
13d60 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
13d70 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
13d80 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
13d90 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
13da0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
13db0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
13dc0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
13dd0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
13de0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
13df0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
13e00 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
13e10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13e20 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
13e30 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
13e40 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
13e50 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
13e60 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  .if (pSlotList =
13e70 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
13e80 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
13e90 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  nt;....CACKEY_DE
13ea0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
13eb0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
13ec0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
13ed0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
13ee0 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75  .}...count = *pu
13ef0 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75  lCount;..if (cou
13f00 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  nt < slot_count)
13f10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13f20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13f30 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20   User allocated 
13f40 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74  %lu entries, but
13f50 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74   we have %lu ent
13f60 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73  ries.", count, s
13f70 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  lot_count);....r
13f80 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
13f90 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
13fa0 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
13fb0 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
13fc0 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 72   slot_count; cur
13fd0 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 53 6c  rslot++) {...pSl
13fe0 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d  otList[currslot]
13ff0 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 7d 0a   = currslot;..}.
14000 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
14010 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
14020 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14030 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
14040 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
14050 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b  lu readers.", CK
14060 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
14070 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
14080 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
14090 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73  OK);...tokenPres
140a0 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65  ent = tokenPrese
140b0 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  nt; /* Supress u
140c0 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
140d0 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
140e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
140f0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
14100 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
14110 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54   slotID, CK_SLOT
14120 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
14130 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
14140 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72  F8CHAR slotDescr
14150 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
14160 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d  ey Slot";..int m
14170 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
14180 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  t bytes_to_copy;
14190 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
141a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
141b0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
141c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
141d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
141e0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
141f0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
14200 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
14210 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
14220 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
14230 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
14240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
14250 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
14260 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
14270 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
14280 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
14290 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
142a0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
142b0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
142c0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
142d0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
142e0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
142f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14300 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
14310 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
14320 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
14330 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
14340 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
14350 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
14360 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
14370 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
14380 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
14390 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
143a0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
143b0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
143c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
143d0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
143e0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
143f0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
14400 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
14410 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
14420 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
14430 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
14440 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
14450 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
14460 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
14470 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
14480 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
14490 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
144a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
144b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
144c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
144d0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
144e0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
144f0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
14500 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
14510 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
14520 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
14530 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14540 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
14550 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
14560 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
14570 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
14580 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
14590 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
145a0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
145b0 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  of(pInfo->slotDe
145c0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
145d0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mcpy(pInfo->slot
145e0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f  Description, slo
145f0 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  tDescription, si
14600 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70  zeof(slotDescrip
14610 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  tion) - 1);...me
14620 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
14630 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
14640 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
14650 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
14660 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
14670 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79   = strlen(cackey
14680 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70  _slots[slotID].p
14690 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66  csc_reader);..if
146a0 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e   (sizeof(pInfo->
146b0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
146c0 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  < bytes_to_copy)
146d0 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f   {...bytes_to_co
146e0 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66  py = sizeof(pInf
146f0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
14700 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70  D);..}..memcpy(p
14710 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
14720 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f  erID, cackey_slo
14730 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
14740 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f  reader, bytes_to
14750 5f 63 6f 70 79 29 3b 0a 0a 09 70 49 6e 66 6f 2d  _copy);...pInfo-
14760 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 52 45 4d  >flags = CKF_REM
14770 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 20 7c 20  OVABLE_DEVICE | 
14780 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69  CKF_HW_SLOT;...i
14790 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
147a0 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
147b0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d  slots[slotID]) =
147c0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
147d0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
147e0 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c  ..pInfo->flags |
147f0 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53  = CKF_TOKEN_PRES
14800 45 4e 54 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ENT;..}...pInfo-
14810 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
14820 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79  .major = (cackey
14830 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
14840 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49   16) & 0xff;..pI
14850 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72  nfo->hardwareVer
14860 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61  sion.minor = (ca
14870 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
14880 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
14890 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
148a0 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
148b0 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66   0x00;..pInfo->f
148c0 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
148d0 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43  inor = 0x00;...C
148e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
148f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
14900 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
14910 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
14920 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
14930 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
14940 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  RV, C_GetTokenIn
14950 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
14960 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f  lotID, CK_TOKEN_
14970 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
14980 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
14990 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72  8CHAR manufactur
149a0 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47  erID[] = "U.S. G
149b0 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61  overnment";..sta
149c0 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
149d0 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d  defaultLabel[] =
149e0 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22   "Unknown Token"
149f0 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
14a00 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20  8CHAR model[] = 
14a10 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74  "CAC Token";..st
14a20 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
14a30 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
14a40 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
14a50 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
14a60 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c  erts;..ssize_t l
14a70 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  abel_ret;..int m
14a80 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
14a90 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  t use_default_la
14aa0 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  bel;...CACKEY_DE
14ab0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
14ac0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
14ad0 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
14ae0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14af0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
14b00 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
14b10 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
14b20 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
14b30 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
14b40 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
14b50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14b60 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
14b70 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
14b80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
14b90 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
14ba0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
14bb0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
14bc0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
14bd0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
14be0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
14bf0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
14c00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14c10 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
14c20 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
14c30 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
14c40 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
14c50 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
14c60 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
14c70 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
14c80 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
14c90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
14ca0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
14cb0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
14cc0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
14cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14ce0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
14cf0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
14d00 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
14d10 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
14d20 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
14d30 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
14d40 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
14d50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14d60 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
14d70 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
14d80 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
14d90 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
14da0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
14db0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
14dc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
14dd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
14de0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
14df0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
14e00 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
14e10 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
14e20 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59  otID]) != CACKEY
14e30 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
14e40 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  SENT) {...CACKEY
14e50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e  _DEBUG_PRINTF("N
14e60 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65  o token is prese
14e70 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25  nt in slotID = %
14e80 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  lu", slotID);...
14e90 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
14ea0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
14eb0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
14ec0 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52  CKR_TOKEN_NOT_PR
14ed0 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74  ESENT);..}...mut
14ee0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
14ef0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
14f00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
14f10 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
14f20 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
14f30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14f40 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
14f50 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
14f60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
14f70 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
14f80 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  ../* Determine t
14f90 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20  oken label from 
14fa0 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a  certificates */.
14fb0 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c  .memset(pInfo->l
14fc0 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f  abel, ' ', sizeo
14fd0 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
14fe0 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  ;..use_default_l
14ff0 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 70 63 73 63  abel = 1;...pcsc
15000 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
15010 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
15020 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
15030 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75  otID], NULL, &nu
15040 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70  m_certs);..if (p
15050 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21  csc_identities !
15060 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
15070 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b  num_certs > 0) {
15080 0a 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20  ....label_ret = 
15090 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
150a0 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63  tity_to_label(pc
150b0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70  sc_identities, p
150c0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
150d0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
150e0 29 29 3b 0a 09 09 09 69 66 20 28 6c 61 62 65 6c  ));....if (label
150f0 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09  _ret > 0) {.....
15100 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
15110 6c 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 0a  l = 0;....}...}.
15120 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
15130 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
15140 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
15150 20 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73   1);..}...if (us
15160 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29  e_default_label)
15170 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66   {...memcpy(pInf
15180 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c  o->label, defaul
15190 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64  tLabel, sizeof(d
151a0 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31  efaultLabel) - 1
151b0 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
151c0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
151d0 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
151e0 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
151f0 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63  turerID));..memc
15200 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
15210 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61  cturerID, manufa
15220 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66  cturerID, sizeof
15230 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  (manufacturerID)
15240 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
15250 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20  pInfo->model, ' 
15260 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
15270 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70  >model));..memcp
15280 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20  y(pInfo->model, 
15290 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f  model, sizeof(mo
152a0 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  del) - 1);...mem
152b0 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  set(pInfo->seria
152c0 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69  lNumber, ' ', si
152d0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69  zeof(pInfo->seri
152e0 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65  alNumber));...me
152f0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54  mset(pInfo->utcT
15300 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ime, ' ', sizeof
15310 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29  (pInfo->utcTime)
15320 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  );...pInfo->hard
15330 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
15340 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
15350 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
15360 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
15370 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
15380 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
15390 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
153a0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e  8) & 0xff;...pIn
153b0 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
153c0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30  ion.major = 0x00
153d0 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ;..pInfo->firmwa
153e0 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
153f0 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d  = 0x00;...pInfo-
15400 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49  >flags = CKF_WRI
15410 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43  TE_PROTECTED | C
15420 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54  KF_USER_PIN_INIT
15430 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f  IALIZED | CKF_TO
15440 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20  KEN_INITIALIZED 
15450 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  | CKF_LOGIN_REQU
15460 49 52 45 44 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75  IRED;...pInfo->u
15470 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74  lMaxSessionCount
15480 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   = (sizeof(cacke
15490 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
154a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
154b0 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09  ions[0])) - 1;..
154c0 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e  pInfo->ulSession
154d0 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41  Count = CK_UNAVA
154e0 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
154f0 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ON;..pInfo->ulMa
15500 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  xRwSessionCount 
15510 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52  = 0;..pInfo->ulR
15520 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  wSessionCount = 
15530 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
15540 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
15550 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20  fo->ulMaxPinLen 
15560 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75  = 128;..pInfo->u
15570 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a  lMinPinLen = 0;.
15580 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50  .pInfo->ulTotalP
15590 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b  ublicMemory = CK
155a0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
155b0 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
155c0 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65  ->ulFreePublicMe
155d0 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
155e0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
155f0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74  N;..pInfo->ulTot
15600 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20  alPrivateMemory 
15610 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
15620 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
15630 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76  Info->ulFreePriv
15640 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  ateMemory = CK_U
15650 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
15660 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59  MATION;...CACKEY
15670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15680 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
15690 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
156a0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
156b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
156c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
156d0 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
156e0 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  t)(CK_FLAGS flag
156f0 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54  s, CK_SLOT_ID_PT
15700 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f  R pSlotID, CK_VO
15710 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64  ID_PTR pReserved
15720 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
15730 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
15740 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65  .");...if (pRese
15750 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  rved != NULL) {.
15760 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15770 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52  RINTF("Error. pR
15780 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e  eserved is not N
15790 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
157a0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
157b0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
157c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
157d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
157e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
157f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
15800 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
15810 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
15820 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
15830 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
15840 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
15850 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
15860 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
15870 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
15880 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
15890 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
158a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
158b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
158c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
158d0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63  (CK_RV, C_GetMec
158e0 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53  hanismList)(CK_S
158f0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
15900 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45  K_MECHANISM_TYPE
15910 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c  _PTR pMechanismL
15920 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ist, CK_ULONG_PT
15930 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  R pulCount) {..C
15940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15950 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
15960 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
15970 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
15980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15990 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
159a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
159b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
159c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
159d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
159e0 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  (pulCount == NUL
159f0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
15a00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15a10 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20  r.  pulCount is 
15a20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
15a30 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
15a40 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
15a50 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d  pMechanismList =
15a60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
15a70 43 6f 75 6e 74 20 3d 20 33 3b 0a 0a 09 09 43 41  Count = 3;....CA
15a80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15a90 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
15aa0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
15ab0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
15ac0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
15ad0 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 33 29 20 7b  *pulCount < 3) {
15ae0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15af0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15b00 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c  Buffer too small
15b10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
15b20 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
15b30 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68  ALL);..}...pMech
15b40 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43  anismList[0] = C
15b50 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 70 4d  KM_RSA_PKCS;..pM
15b60 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 31 5d 20  echanismList[1] 
15b70 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50  = CKM_SHA1_RSA_P
15b80 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  KCS;..*pulCount 
15b90 3d 20 32 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 2;...CACKEY_DE
15ba0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
15bb0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
15bc0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
15bd0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
15be0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
15bf0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
15c00 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28  tMechanismInfo)(
15c10 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
15c20 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  D, CK_MECHANISM_
15c30 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45  TYPE type, CK_ME
15c40 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52  CHANISM_INFO_PTR
15c50 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d   pInfo) {..int m
15c60 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
15c70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15c80 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
15c90 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
15ca0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
15cb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
15cc0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
15cd0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
15ce0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
15cf0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
15d00 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
15d10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15d20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15d30 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
15d40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
15d50 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
15d60 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
15d70 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
15d80 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
15d90 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
15da0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
15db0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
15dc0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
15dd0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15de0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
15df0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
15e00 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
15e10 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
15e20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15e30 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
15e40 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
15e50 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
15e60 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
15e70 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
15e80 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
15e90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15ea0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15eb0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
15ec0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
15ed0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
15ee0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
15ef0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
15f00 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
15f10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15f20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
15f30 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
15f40 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
15f50 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
15f60 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
15f70 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
15f80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
15f90 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
15fa0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
15fb0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
15fc0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
15fd0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
15fe0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
15ff0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
16000 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
16010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16020 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
16030 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
16040 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
16050 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
16060 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 68 69 73  }.../* XXX: This
16070 20 69 73 20 75 6e 74 65 73 74 65 64 2c 20 61 6e   is untested, an
16080 64 20 66 75 72 74 68 65 72 20 49 27 6d 20 6e 6f  d further I'm no
16090 74 20 72 65 61 6c 6c 79 20 73 75 72 65 20 69 66  t really sure if
160a0 20 74 68 69 73 20 69 73 20 63 6f 72 72 65 63 74   this is correct
160b0 2e 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 74 79  . */..switch (ty
160c0 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  pe) {...case CKM
160d0 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49  _RSA_PKCS:....pI
160e0 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a  nfo->ulMinKeySiz
160f0 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66  e = 512;....pInf
16100 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20  o->ulMaxKeySize 
16110 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f  = 8192;....pInfo
16120 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57  ->flags = CKF_HW
16130 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c   | CKF_ENCRYPT |
16140 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43   CKF_DECRYPT | C
16150 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45  KF_SIGN | CKF_VE
16160 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  RIFY;....break;.
16170 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 58  ..case CKM_RSA_X
16180 5f 35 30 39 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e  _509:....pInfo->
16190 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35  ulMinKeySize = 5
161a0 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  12;....pInfo->ul
161b0 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39  MaxKeySize = 819
161c0 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  2;....pInfo->fla
161d0 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b  gs = CKF_HW | CK
161e0 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f  F_ENCRYPT | CKF_
161f0 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49  DECRYPT | CKF_SI
16200 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b  GN | CKF_VERIFY;
16210 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
16220 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50  e CKM_SHA1_RSA_P
16230 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  KCS:....pInfo->u
16240 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31  lMinKeySize = 51
16250 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  2;....pInfo->ulM
16260 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32  axKeySize = 8192
16270 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  ;....pInfo->flag
16280 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46  s = CKF_HW | CKF
16290 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49  _SIGN | CKF_VERI
162a0 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  FY;....break;..}
162b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
162c0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
162d0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
162e0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
162f0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(CKR_OK);.}../*
16300 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72   We don't suppor
16310 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a  t this method. *
16320 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
16330 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
16340 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54  itToken)(CK_SLOT
16350 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55  _ID slotID, CK_U
16360 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
16370 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
16380 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  Len, CK_UTF8CHAR
16390 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09  _PTR pLabel) {..
163a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
163b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
163c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
163d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
163e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
163f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
16400 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
16410 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
16420 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
16430 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
16440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16450 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
16460 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
16470 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b  TECTED (%i)", CK
16480 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
16490 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75  OTECTED);...retu
164a0 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  rn(CKR_TOKEN_WRI
164b0 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d  TE_PROTECTED);.}
164c0 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
164d0 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
164e0 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
164f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
16500 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45  C_InitPIN)(CK_SE
16510 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
16520 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
16530 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
16540 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20  ULONG ulPinLen) 
16550 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
16560 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
16570 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
16580 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
16590 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
165a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
165b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
165c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
165d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
165e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
165f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16600 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
16610 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
16620 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c  PROTECTED (%i)",
16630 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
16640 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72  _PROTECTED);...r
16650 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
16660 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
16670 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
16680 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
16690 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
166a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
166b0 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f  V, C_SetPIN)(CK_
166c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
166d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38  Session, CK_UTF8
166e0 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e  CHAR_PTR pOldPin
166f0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64  , CK_ULONG ulOld
16700 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43  PinLen, CK_UTF8C
16710 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c  HAR_PTR pNewPin,
16720 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50   CK_ULONG ulNewP
16730 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  inLen) {..CACKEY
16740 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
16750 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
16760 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
16770 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
16780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16790 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
167a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
167b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
167c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
167d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
167e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
167f0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
16800 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
16810 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
16820 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
16830 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
16840 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
16850 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
16860 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
16870 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53  N(CK_RV, C_OpenS
16880 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f  ession)(CK_SLOT_
16890 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c  ID slotID, CK_FL
168a0 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f  AGS flags, CK_VO
168b0 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74  ID_PTR pApplicat
168c0 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e  ion, CK_NOTIFY n
168d0 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f  otify, CK_SESSIO
168e0 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53  N_HANDLE_PTR phS
168f0 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67  ession) {..unsig
16900 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69  ned long idx;..i
16910 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
16920 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73  ..int found_sess
16930 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  ion = 0;...CACKE
16940 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16950 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
16960 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45  ((flags & CKF_SE
16970 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d  RIAL_SESSION) !=
16980 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
16990 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ION) {...return(
169a0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41  CKR_SESSION_PARA
169b0 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  LLEL_NOT_SUPPORT
169c0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ED);..}...if (!c
169d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
169e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
169f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16a00 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
16a10 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
16a20 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
16a30 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
16a40 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
16a50 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
16a60 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
16a70 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
16a80 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
16a90 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
16aa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16ab0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
16ac0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
16ad0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
16ae0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
16af0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
16b00 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
16b10 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
16b20 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
16b30 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
16b40 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
16b50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
16b60 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
16b70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16b80 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
16b90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
16ba0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
16bb0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
16bc0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
16bd0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
16be0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16bf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16c00 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
16c10 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
16c20 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
16c30 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
16c40 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
16c50 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
16c60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
16c70 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
16c80 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
16c90 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
16ca0 68 65 20 63 61 72 64 20 69 73 20 61 63 74 75 61  he card is actua
16cb0 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e  lly in the slot.
16cc0 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65   */../* XXX: Che
16cd0 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
16ce0 74 68 69 73 20 69 73 20 69 6e 20 74 68 65 20 50  this is in the P
16cf0 4b 43 53 23 31 31 20 73 70 65 63 69 66 69 63 61  KCS#11 specifica
16d00 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63  tion */..if (cac
16d10 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
16d20 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
16d30 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b  slotID]) != CACK
16d40 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
16d50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  RESENT) {...CACK
16d60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16d70 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f  "Error.  Card no
16d80 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75  t present.  Retu
16d90 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45  rning CKR_DEVICE
16da0 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63  _REMOVED");....c
16db0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
16dc0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
16dd0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
16de0 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
16df0 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
16e00 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 1; idx < (siz
16e10 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
16e20 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
16e30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
16e40 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
16e50 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
16e60 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
16e70 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73   {....found_sess
16e80 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68  ion = 1;.....*ph
16e90 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a  Session = idx;..
16ea0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
16eb0 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
16ec0 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   1;....cackey_se
16ed0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
16ee0 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09  ID = slotID;....
16ef0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
16f00 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  idx].state = CKS
16f10 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49  _RO_PUBLIC_SESSI
16f20 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ON;....cackey_se
16f30 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67  ssions[idx].flag
16f40 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61  s = flags;....ca
16f50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
16f60 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  x].ulDeviceError
16f70 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
16f80 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41  sessions[idx].pA
16f90 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70  pplication = pAp
16fa0 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61  plication;....ca
16fb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
16fc0 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69  x].Notify = noti
16fd0 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  fy;.....cackey_s
16fe0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
16ff0 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
17000 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
17010 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
17020 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  es_count = 0;...
17030 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
17040 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63  s[idx].search_ac
17050 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
17060 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
17070 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  x].sign_active =
17080 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
17090 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63  essions[idx].dec
170a0 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
170b0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
170c0 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
170d0 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
170e0 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63  ad_identities(&c
170f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
17100 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73  ID], &cackey_ses
17110 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
17120 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a  ities_count);...
17130 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
17140 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
17150 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
17160 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
17170 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
17180 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
17190 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
171a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
171b0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
171c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
171d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
171e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75  );..}...if (!fou
171f0 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09  nd_session) {...
17200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17210 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
17220 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
17230 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53   (%i)", CKR_SESS
17240 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72  ION_COUNT);....r
17250 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
17260 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43  N_COUNT);..}...C
17270 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17280 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
17290 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
172a0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
172b0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
172c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
172d0 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69  RV, C_CloseSessi
172e0 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  on)(CK_SESSION_H
172f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
17300 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
17310 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
17320 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
17330 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
17340 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
17350 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17360 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17370 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
17380 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
17390 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
173a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
173b0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
173c0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
173d0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
173e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
173f0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
17400 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
17410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17420 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
17430 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
17440 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
17450 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
17460 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
17470 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
17480 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
17490 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
174a0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
174b0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
174c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
174d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
174e0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
174f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
17500 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
17510 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
17520 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
17530 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
17540 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
17550 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
17560 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
17570 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17580 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
17590 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
175a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
175b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
175c0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
175d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
175e0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30  sion].active = 0
175f0 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  ;..cackey_free_i
17600 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79  dentities(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 69 64 65 6e 74 69 74 69 65 73 2c 20  on].identities, 
17630 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
17640 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
17650 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d  ties_count);...m
17660 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
17670 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
17680 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
17690 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
176a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
176b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
176c0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
176d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
176e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
176f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
17700 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
17710 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
17720 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
17730 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
17740 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
17750 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
17760 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65  N(CK_RV, C_Close
17770 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f  AllSessions)(CK_
17780 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20  SLOT_ID slotID) 
17790 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
177a0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
177b0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
177c0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
177d0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
177e0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
177f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
17800 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
17810 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
17820 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
17830 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
17840 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
17850 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
17860 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
17870 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
17880 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
17890 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
178a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
178b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
178c0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
178d0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
178e0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
178f0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
17900 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17910 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
17920 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
17930 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
17940 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
17950 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
17960 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
17970 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
17980 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
17990 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
179a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
179b0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
179c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
179d0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
179e0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
179f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17a00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
17a10 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
17a20 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
17a30 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
17a40 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
17a50 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
17a60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
17a70 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
17a80 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
17a90 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f  NVALID);..}...fo
17aa0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
17ab0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
17ac0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
17ad0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
17ae0 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
17af0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
17b00 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
17b10 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63  tive) {....if (c
17b20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
17b30 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c  dx].slotID != sl
17b40 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74  otID) {.....cont
17b50 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  inue;....}.....c
17b60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
17b70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
17b80 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65  k);....C_CloseSe
17b90 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63  ssion(idx);....c
17ba0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
17bb0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
17bc0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
17bd0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
17be0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
17bf0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
17c00 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
17c10 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
17c20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17c30 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
17c40 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
17c50 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
17c60 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
17c70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17c80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
17c90 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
17ca0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
17cb0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
17cc0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
17cd0 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f  _RV, C_GetSessio
17ce0 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f  nInfo)(CK_SESSIO
17cf0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
17d00 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e  n, CK_SESSION_IN
17d10 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
17d20 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
17d30 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
17d40 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
17d50 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
17d60 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
17d70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17d80 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
17d90 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
17da0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
17db0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
17dc0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
17dd0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
17de0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17df0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
17e00 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
17e10 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
17e20 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
17e30 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
17e40 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
17e50 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
17e60 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
17e70 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
17e80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
17e90 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
17ea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17eb0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
17ec0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
17ed0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
17ee0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
17ef0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
17f00 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
17f10 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
17f20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
17f30 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
17f40 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
17f50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17f60 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
17f70 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
17f80 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
17f90 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
17fa0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
17fb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
17fc0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
17fd0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
17fe0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
17ff0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18000 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
18010 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
18020 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
18030 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
18040 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
18050 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20  ..pInfo->slotID 
18060 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
18070 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
18080 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74  ID;..pInfo->stat
18090 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  e = cackey_sessi
180a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
180b0 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  ate;..pInfo->fla
180c0 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  gs = cackey_sess
180d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66  ions[hSession].f
180e0 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  lags;..pInfo->ul
180f0 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61  DeviceError = ca
18100 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
18110 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65  ession].ulDevice
18120 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72  Error;...mutex_r
18130 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
18140 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
18150 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
18160 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
18170 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
18180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18190 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
181a0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
181b0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
181c0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
181d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
181e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
181f0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
18200 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
18210 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
18220 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
18230 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f  V, C_GetOperatio
18240 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49  nState)(CK_SESSI
18250 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
18260 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
18270 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c  pOperationState,
18280 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
18290 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c  lOperationStateL
182a0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
182b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
182c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
182d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
182e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
182f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18300 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
18310 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18320 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
18330 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
18340 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
18350 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
18360 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
18370 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
18380 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
18390 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
183a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
183b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
183c0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
183d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
183e0 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61  K_RV, C_SetOpera
183f0 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45  tionState)(CK_SE
18400 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
18410 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
18420 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61  TR pOperationSta
18430 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f  te, CK_ULONG ulO
18440 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e  perationStateLen
18450 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
18460 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65  LE hEncryptionKe
18470 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
18480 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61 74  DLE hAuthenticat
18490 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  ionKey) {..CACKE
184a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
184b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
184c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
184d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
184e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
184f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
18500 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
18510 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
18520 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
18530 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
18540 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18550 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
18560 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
18570 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
18580 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
18590 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
185a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
185b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
185c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
185d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69  ON(CK_RV, C_Logi
185e0 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
185f0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
18600 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72  K_USER_TYPE user
18610 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41  Type, CK_UTF8CHA
18620 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
18630 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b  LONG ulPinLen) {
18640 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
18650 61 6c 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72  al;..int login_r
18660 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
18670 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
18680 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
18690 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
186a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
186b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
186c0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
186d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
186e0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
186f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
18700 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
18710 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
18720 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
18730 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
18740 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
18750 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
18760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18770 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
18780 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
18790 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
187a0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
187b0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
187c0 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70  .}...if (userTyp
187d0 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b  e != CKU_USER) {
187e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
187f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
18800 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
18810 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64  USER mode, asked
18820 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c   for %lu mode.",
18830 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18840 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65   userType)....re
18850 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59  turn(CKR_USER_TY
18860 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  PE_INVALID);..}.
18870 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
18880 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
18890 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
188a0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
188b0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
188c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
188d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
188e0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
188f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
18900 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
18910 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
18920 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18930 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
18940 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
18950 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
18960 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
18970 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18980 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
18990 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
189a0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
189b0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
189c0 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65  );..}...login_re
189d0 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  t = cackey_login
189e0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (&cackey_slots[c
189f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
18a00 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d  Session].slotID]
18a10 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e  , pPin, ulPinLen
18a20 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6c 6f  , NULL);..if (lo
18a30 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  gin_ret != CACKE
18a40 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
18a50 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
18a60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
18a70 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 67  ock);....if (log
18a80 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59  in_ret == CACKEY
18a90 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20  _PCSC_E_LOCKED) 
18aa0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
18ab0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18ac0 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65    Token is locke
18ad0 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
18ae0 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29  (CKR_PIN_LOCKED)
18af0 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c  ;...} else if (l
18b00 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
18b10 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
18b20 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
18b30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18b40 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e  r.  Invalid PIN.
18b50 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
18b60 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
18b70 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
18b80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18b90 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65  rror.  Unknown e
18ba0 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72  rror returned fr
18bb0 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  om cackey_login(
18bc0 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72  ) (%i)", login_r
18bd0 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  et);....return(C
18be0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
18bf0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
18c00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18c10 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
18c20 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b  _USER_FUNCTIONS;
18c30 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
18c40 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
18c50 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
18c60 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
18c70 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
18c80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18c90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
18ca0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
18cb0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
18cc0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
18cd0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
18ce0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
18cf0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
18d00 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
18d10 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
18d20 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
18d30 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
18d40 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f  ogout)(CK_SESSIO
18d50 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
18d60 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
18d70 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
18d80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
18d90 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
18da0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
18db0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
18dc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18dd0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
18de0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
18df0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
18e00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
18e10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
18e20 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
18e30 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
18e40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
18e50 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
18e60 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
18e70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
18e80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18e90 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
18ea0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
18eb0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
18ec0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
18ed0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
18ee0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
18ef0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
18f00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
18f10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
18f20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
18f30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18f40 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
18f50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18f60 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
18f70 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
18f80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
18f90 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
18fa0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
18fb0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
18fc0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
18fd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18fe0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
18ff0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
19000 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
19010 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
19020 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
19030 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19040 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d  Session].state =
19050 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53   CKS_RO_PUBLIC_S
19060 45 53 53 49 4f 4e 3b 0a 0a 09 6d 75 74 65 78 5f  ESSION;...mutex_
19070 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
19080 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
19090 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
190a0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
190b0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
190c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
190d0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
190e0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
190f0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
19100 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
19110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19120 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
19130 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
19140 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
19150 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
19160 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
19170 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65  RV, C_CreateObje
19180 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
19190 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
191a0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
191b0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
191c0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
191d0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
191e0 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09  TR phObject) {..
191f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19200 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
19210 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
19220 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
19230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19240 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
19250 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
19260 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
19270 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
19280 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
19290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
192a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
192b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
192c0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
192d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
192e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
192f0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
19300 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
19310 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
19320 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
19330 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f  _CopyObject)(CK_
19340 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
19350 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
19360 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
19370 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
19380 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
19390 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
193a0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
193b0 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63  E_PTR phNewObjec
193c0 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
193d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
193e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
193f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
19400 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
19410 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
19420 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
19430 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
19440 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
19450 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
19460 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
19470 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
19480 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
19490 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
194a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
194b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
194c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
194d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
194e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
194f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
19500 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62  _RV, C_DestroyOb
19510 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ject)(CK_SESSION
19520 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
19530 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
19540 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43  LE hObject) {..C
19550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19560 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
19570 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
19580 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
19590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
195a0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
195b0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
195c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
195d0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
195e0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
195f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19600 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
19610 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
19620 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
19630 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
19640 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
19650 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
19660 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
19670 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
19680 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
19690 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43  GetObjectSize)(C
196a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
196b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
196c0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
196d0 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ect, CK_ULONG_PT
196e0 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41  R pulSize) {..CA
196f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19700 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
19710 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
19720 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
19730 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19740 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
19750 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
19760 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
19770 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
19780 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
19790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
197a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
197b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
197c0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
197d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
197e0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
197f0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
19800 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
19810 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
19820 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
19830 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
19840 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
19850 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
19860 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
19870 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49  Object, CK_ATTRI
19880 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
19890 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
198a0 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52  ount) {..CK_ATTR
198b0 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
198c0 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
198d0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
198e0 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ity;..unsigned l
198f0 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ong identity_idx
19900 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73  , attr_idx, sess
19910 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69  _attr_idx, num_i
19920 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ds;..int mutex_r
19930 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65  etval;..CK_RV re
19940 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09  tval = CKR_OK;..
19950 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c  CK_VOID_PTR pVal
19960 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ue;..CK_ULONG ul
19970 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b  ValueLen;...CACK
19980 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19990 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
199a0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
199b0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
199c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
199d0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
199e0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
199f0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
19a00 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
19a10 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
19a20 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
19a30 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
19a40 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
19a50 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
19a60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
19a70 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
19a80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
19a90 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
19aa0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
19ab0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
19ac0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
19ad0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  LID);..}...if (h
19ae0 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09  Object == 0) {..
19af0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19b00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62  INTF("Error.  Ob
19b10 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20  ject handle out 
19b20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
19b30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a  ..return(CKR_OBJ
19b40 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ECT_HANDLE_INVAL
19b50 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  ID);..}...if (ul
19b60 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  Count == 0) {...
19b70 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
19b80 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74  , if zero object
19b90 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
19ba0 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65   return zero ite
19bb0 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  ms immediately *
19bc0 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
19bd0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
19be0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
19bf0 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
19c00 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
19c10 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
19c20 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20  ..if (pTemplate 
19c30 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
19c40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19c50 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c  ("Error.  pTempl
19c60 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ate is NULL.");.
19c70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
19c80 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
19c90 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20  ...identity_idx 
19ca0 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a  = hObject - 1;..
19cb0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
19cc0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
19cd0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
19ce0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
19cf0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
19d00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19d10 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
19d20 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
19d30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
19d40 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
19d50 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
19d60 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
19d70 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
19d80 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
19d90 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
19da0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
19db0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
19dc0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
19dd0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
19de0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
19df0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
19e00 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d  ;..}...num_ids =
19e10 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
19e20 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
19e30 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69  ities_count;...i
19e40 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20  f (identity_idx 
19e50 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09  >= num_ids) {...
19e60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
19e70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
19e80 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
19e90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19ea0 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64  or.  Object hand
19eb0 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
19ec0 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d    identity_idx =
19ed0 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20   %lu, num_ids = 
19ee0 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu.", (unsigned
19ef0 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
19f00 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  idx, (unsigned l
19f10 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a  ong) num_ids);..
19f20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a  ..return(CKR_OBJ
19f30 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ECT_HANDLE_INVAL
19f40 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69  ID);..}...identi
19f50 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  ty = &cackey_ses
19f60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
19f70 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74  identities[ident
19f80 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20  ity_idx];...for 
19f90 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61  (attr_idx = 0; a
19fa0 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e  ttr_idx < ulCoun
19fb0 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  t; attr_idx++) {
19fc0 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26  ...curr_attr = &
19fd0 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69  pTemplate[attr_i
19fe0 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d  dx];....pValue =
19ff0 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65   NULL;...ulValue
1a000 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
1a010 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  -1;....CACKEY_DE
1a020 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b  BUG_PRINTF("Look
1a030 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74  ing for attribut
1a040 65 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74  e 0x%08lx (ident
1a050 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28  ity:%lu) ...", (
1a060 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1a070 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20  urr_attr->type, 
1a080 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a090 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a  identity_idx);..
1a0a0 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72  ..for (sess_attr
1a0b0 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61  _idx = 0; sess_a
1a0c0 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69  ttr_idx < identi
1a0d0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63  ty->attributes_c
1a0e0 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f  ount; sess_attr_
1a0f0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28  idx++) {....if (
1a100 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
1a110 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
1a120 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72  dx].type == curr
1a130 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09  _attr->type) {..
1a140 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a150 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75  PRINTF(" ... fou
1a160 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20  nd it, pValue = 
1a170 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  %p, ulValueLen =
1a180 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d   %lu", identity-
1a190 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1a1a0 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75  _attr_idx].pValu
1a1b0 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74  e, identity->att
1a1c0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
1a1d0 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  r_idx].ulValueLe
1a1e0 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61  n);..........pVa
1a1f0 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  lue = identity->
1a200 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
1a210 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
1a220 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1a230 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   = identity->att
1a240 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
1a250 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  r_idx].ulValueLe
1a260 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  n;....}...}....i
1a270 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  f (curr_attr->pV
1a280 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29 20  alue && pValue) 
1a290 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  {....if (curr_at
1a2a0 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e  tr->ulValueLen >
1a2b0 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a  = ulValueLen) {.
1a2c0 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
1a2d0 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56  attr->pValue, pV
1a2e0 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e  alue, ulValueLen
1a2f0 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  );....} else {..
1a300 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1a310 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09  (CK_LONG) -1;...
1a320 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
1a330 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
1a340 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75  ;....}...}....cu
1a350 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65  rr_attr->ulValue
1a360 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  Len = ulValueLen
1a370 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1a380 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1a390 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1a3a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1a3b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1a3c0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1a3d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a3e0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1a3f0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1a400 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1a410 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1a420 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54  retval == CKR_AT
1a430 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56  TRIBUTE_TYPE_INV
1a440 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59  ALID) {...CACKEY
1a450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1a460 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54  eturning CKR_ATT
1a470 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41  RIBUTE_TYPE_INVA
1a480 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29  LID (%i)", (int)
1a490 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73   retval);..} els
1a4a0 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  e if (retval == 
1a4b0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
1a4c0 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  MALL) {...CACKEY
1a4d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1a4e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46  eturning CKR_BUF
1a4f0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25  FER_TOO_SMALL (%
1a500 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  i)", (int) retva
1a510 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  l);..} else if (
1a520 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b  retval == CKR_OK
1a530 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a540 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1a550 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1a560 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
1a570 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41  ;..} else {...CA
1a580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a590 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22  F("Returning %i"
1a5a0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
1a5b0 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ..}...return(ret
1a5c0 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  val);.}..CK_DEFI
1a5d0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1a5e0 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75 74  V, C_SetAttribut
1a5f0 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49  eValue)(CK_SESSI
1a600 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1a610 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
1a620 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
1a630 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
1a640 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
1a650 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  NG ulCount) {..C
1a660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a670 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1a680 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1a690 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1a6a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a6b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1a6c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1a6d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1a6e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1a6f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1a700 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a710 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1a720 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1a730 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1a740 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1a750 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1a760 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1a770 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1a780 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1a790 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1a7a0 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29  FindObjectsInit)
1a7b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1a7c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1a7d0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
1a7e0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
1a7f0 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e  G ulCount) {..in
1a800 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1a810 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a820 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1a830 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1a840 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1a850 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a860 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1a870 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1a880 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1a890 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1a8a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1a8b0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1a8c0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1a8d0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1a8e0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1a8f0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1a900 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1a910 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a920 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1a930 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1a940 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1a950 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1a960 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1a970 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1a980 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1a990 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1a9a0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1a9b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1a9c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a9d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1a9e0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1a9f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1aa00 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1aa10 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1aa20 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1aa30 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1aa40 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1aa50 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1aa60 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1aa70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1aa80 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1aa90 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1aaa0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1aab0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1aac0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1aad0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1aae0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
1aaf0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1ab00 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1ab10 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1ab20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ab30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
1ab40 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69  rch already acti
1ab50 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1ab60 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
1ab70 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69  _ACTIVE);..}...i
1ab80 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1ab90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1aba0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
1abb0 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ].slot_reset) {.
1abc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1abd0 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20  RINTF("The slot 
1abe0 68 61 73 20 62 65 65 6e 20 72 65 73 65 74 20 73  has been reset s
1abf0 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f  ince we last loo
1ac00 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69  ked for identiti
1ac10 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67  es -- rescanning
1ac20 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ");....if (cacke
1ac30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1ac40 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
1ac50 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61  != NULL) {....ca
1ac60 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
1ac70 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73  ties(cackey_sess
1ac80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1ac90 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65  dentities, cacke
1aca0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1acb0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
1acc0 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b  count);.....cack
1acd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1ace0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1acf0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b   = NULL;....cack
1ad00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1ad10 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1ad20 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a  _count = 0;...}.
1ad30 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1ad40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ad50 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
1ad60 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30  ].slot_reset = 0
1ad70 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1ad80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1ad90 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
1ada0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  == NULL) {...cac
1adb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1adc0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1add0 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
1ade0 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b  identities(&cack
1adf0 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f  ey_slots[cackey_
1ae00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1ae10 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63  n].slotID], &cac
1ae20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1ae30 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1ae40 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69  s_count);..}...i
1ae50 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20  f (pTemplate != 
1ae60 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c  NULL) {...if (ul
1ae70 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  Count != 0) {...
1ae80 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1ae90 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1aea0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20  h_query_count = 
1aeb0 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b  ulCount;....cack
1aec0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1aed0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
1aee0 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f  ry = malloc(ulCo
1aef0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54  unt * sizeof(*pT
1af00 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d  emplate));.....m
1af10 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
1af20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1af30 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54  search_query, pT
1af40 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74  emplate, ulCount
1af50 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70   * sizeof(*pTemp
1af60 6c 61 74 65 29 29 3b 0a 09 09 7d 20 65 6c 73 65  late));...} else
1af70 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73   {....cackey_ses
1af80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1af90 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
1afa0 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65  nt = 0;....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 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1afd0 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d  y = NULL;...}..}
1afe0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c   else {...if (ul
1aff0 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  Count != 0) {...
1b000 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1b010 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1b020 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  ock);.....CACKEY
1b030 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b040 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75  rror.  Search qu
1b050 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61 73  ery specified as
1b060 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65   NULL, but numbe
1b070 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73  r of query terms
1b080 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
1b090 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  s 0.");.....retu
1b0a0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1b0b0 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _BAD);...}....ca
1b0c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1b0d0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
1b0e0 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  uery_count = 0;.
1b0f0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1b100 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1b110 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b  ch_query = NULL;
1b120 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
1b130 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1b140 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20  search_active = 
1b150 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  1;..cackey_sessi
1b160 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1b170 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30  arch_curr_id = 0
1b180 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
1b190 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1b1a0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1b1b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1b1c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1b1d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b1e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b1f0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1b200 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b210 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1b220 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1b230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1b240 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1b250 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1b260 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1b270 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1b280 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1b290 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f  FindObjects)(CK_
1b2a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1b2b0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1b2c0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
1b2d0 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Object, CK_ULONG
1b2e0 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
1b2f0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1b300 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20  pulObjectCount) 
1b310 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
1b320 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  _identity *curr_
1b330 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  id;..CK_ATTRIBUT
1b340 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43  E *curr_attr;..C
1b350 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f  K_ULONG curr_id_
1b360 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64  idx, curr_out_id
1b370 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f  _idx, curr_attr_
1b380 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69  idx, sess_attr_i
1b390 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61  dx;..CK_ULONG ma
1b3a0 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65  tched_count, pre
1b3b0 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b  v_matched_count;
1b3c0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1b3d0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1b3e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1b3f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1b400 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1b410 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b420 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b430 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1b440 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b450 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1b460 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1b470 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63  }...if (pulObjec
1b480 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  tCount == NULL) 
1b490 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b4a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b4b0 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20   pulObjectCount 
1b4c0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1b4d0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1b4e0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1b4f0 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
1b500 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  ULL && ulMaxObje
1b510 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
1b520 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
1b530 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65  it, if zero obje
1b540 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69  cts were specifi
1b550 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  ed return zero i
1b560 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  tems immediately
1b570 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74   */...*pulObject
1b580 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41  Count = 0;....CA
1b590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b5a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1b5b0 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
1b5c0 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
1b5d0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
1b5e0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
1b5f0 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c  phObject == NULL
1b600 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b610 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b620 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e  .  phObject is N
1b630 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1b640 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1b650 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
1b660 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
1b670 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1b680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b690 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e  rror.  Maximum n
1b6a0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
1b6b0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65   specified as ze
1b6c0 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ro.");....return
1b6d0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1b6e0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  AD);..}...if (hS
1b6f0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
1b700 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
1b710 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1b720 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1b730 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1b740 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...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 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
1b770 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
1b780 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1b790 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1b7a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1b7b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1b7c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1b7d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1b7e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1b7f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1b800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b810 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1b820 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1b830 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1b840 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1b850 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1b860 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1b870 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1b880 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1b890 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1b8a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b8b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1b8c0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1b8d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1b8e0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1b8f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1b900 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1b910 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1b920 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
1b930 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1b940 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1b950 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1b960 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b970 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
1b980 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1b990 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
1b9a0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
1b9b0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63  IALIZED);..}...c
1b9c0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d  urr_out_id_idx =
1b9d0 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69   0;..for (curr_i
1b9e0 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73  d_idx = cackey_s
1b9f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ba00 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
1ba10 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20  ; curr_id_idx < 
1ba20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ba30 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1ba40 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c  ties_count && ul
1ba50 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20  MaxObjectCount; 
1ba60 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b  curr_id_idx++) {
1ba70 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61  ...curr_id = &ca
1ba80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1ba90 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1baa0 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b  es[curr_id_idx];
1bab0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1bac0 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73  _PRINTF("Process
1bad0 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75  ing identity:%lu
1bae0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1baf0 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  g) curr_id_idx);
1bb00 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ....matched_coun
1bb10 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63  t = 0;....for (c
1bb20 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  urr_attr_idx = 0
1bb30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20  ; curr_attr_idx 
1bb40 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
1bb50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1bb60 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20  ch_query_count; 
1bb70 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29  curr_attr_idx++)
1bb80 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68   {....prev_match
1bb90 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68  ed_count = match
1bba0 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75  ed_count;.....cu
1bbb0 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65  rr_attr = &cacke
1bbc0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1bbd0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1bbe0 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d  y[curr_attr_idx]
1bbf0 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
1bc00 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65  UG_PRINTF("  Che
1bc10 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62  cking for attrib
1bc20 75 74 65 20 30 78 25 30 38 6c 78 20 69 6e 20 69  ute 0x%08lx in i
1bc30 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20  dentity:%i...", 
1bc40 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1bc50 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c  curr_attr->type,
1bc60 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
1bc70 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44  dx);....CACKEY_D
1bc80 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20  EBUG_PRINTBUF(" 
1bc90 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67     Value looking
1bca0 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74   for:", curr_att
1bcb0 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  r->pValue, curr_
1bcc0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
1bcd0 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73  );.....for (sess
1bce0 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73  _attr_idx = 0; s
1bcf0 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  ess_attr_idx < c
1bd00 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
1bd10 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61  es_count; sess_a
1bd20 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
1bd30 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e 61 74  .if (curr_id->at
1bd40 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1bd50 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20  tr_idx].type == 
1bd60 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29  curr_attr->type)
1bd70 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1bd80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
1bd90 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68   ... found match
1bda0 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a  ing type ...");.
1bdb0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1bdc0 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20  G_PRINTBUF("    
1bdd0 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c  ... our value:",
1bde0 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
1bdf0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
1be00 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72  dx].pValue, curr
1be10 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
1be20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
1be30 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1be40 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
1be50 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29  >pValue == NULL)
1be60 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
1be70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
1be80 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77       ... found w
1be90 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b  ildcard match");
1bea0 0a 0a 09 09 09 09 09 09 6d 61 74 63 68 65 64 5f  ........matched_
1beb0 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 09  count++;........
1bec0 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 20  break;......}.. 
1bed0 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  .....if (curr_at
1bee0 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  tr->ulValueLen =
1bef0 3d 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  = curr_id->attri
1bf00 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
1bf10 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  idx].ulValueLen 
1bf20 26 26 20 6d 65 6d 63 6d 70 28 63 75 72 72 5f 61  && memcmp(curr_a
1bf30 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72  ttr->pValue, cur
1bf40 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
1bf50 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
1bf60 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d  pValue, curr_id-
1bf70 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1bf80 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c  _attr_idx].ulVal
1bf90 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  ueLen) == 0) {..
1bfa0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1bfb0 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20  G_PRINTF("      
1bfc0 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74   ... found exact
1bfd0 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 09   match");.......
1bfe0 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b  .matched_count++
1bff0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
1c000 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
1c010 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65 20  }...../* If the 
1c020 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64 20  attribute could 
1c030 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c 20  not be matched, 
1c040 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61  do not try to ma
1c050 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  tch additional a
1c060 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09 09  ttributes */....
1c070 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65 64  if (prev_matched
1c080 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65  _count == matche
1c090 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62  d_count) {.....b
1c0a0 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  reak;....}...}..
1c0b0 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63 6f  ..if (matched_co
1c0c0 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65  unt == cackey_se
1c0d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1c0e0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
1c0f0 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  unt) {....CACKEY
1c100 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1c110 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74 72   ... All %i attr
1c120 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20 66  ibutes checked f
1c130 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67  or found, adding
1c140 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f 20   identity:%i to 
1c150 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c 20  returned list", 
1c160 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73  (int) cackey_ses
1c170 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1c180 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
1c190 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  nt, (int) curr_i
1c1a0 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62  d_idx);.....phOb
1c1b0 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64  ject[curr_out_id
1c1c0 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f  _idx] = curr_id_
1c1d0 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d  idx + 1;.....ulM
1c1e0 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b  axObjectCount--;
1c1f0 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69 64  .....curr_out_id
1c200 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65  _idx++;...} else
1c210 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1c220 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
1c230 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c   Not all %i (onl
1c240 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74 72  y found %i) attr
1c250 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20 66  ibutes checked f
1c260 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64  or found, not ad
1c270 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69  ding identity:%i
1c280 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f  ", (int) cackey_
1c290 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1c2a0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
1c2b0 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74  count, (int) mat
1c2c0 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  ched_count, (int
1c2d0 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a  ) curr_id_idx);.
1c2e0 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73  ..}..}..cackey_s
1c2f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c300 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
1c310 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a   = curr_id_idx;.
1c320 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  .*pulObjectCount
1c330 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69   = curr_out_id_i
1c340 64 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  dx;...mutex_retv
1c350 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1c360 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1c370 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1c380 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1c390 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c3a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c3b0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1c3c0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1c3d0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1c3e0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1c3f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c400 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1c410 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63   (%i), num objec
1c420 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f  ts = %lu", CKR_O
1c430 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  K, *pulObjectCou
1c440 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  nt);...return(CK
1c450 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1c460 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1c470 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
1c480 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  sFinal)(CK_SESSI
1c490 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1c4a0 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  on) {..int mutex
1c4b0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1c4c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c4d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1c4e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1c4f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1c500 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c510 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1c520 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1c530 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1c540 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1c550 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1c560 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1c570 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1c580 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1c590 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1c5a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1c5b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c5c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c5d0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1c5e0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1c5f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1c600 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1c610 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1c620 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1c630 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1c640 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1c650 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1c660 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1c670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c680 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1c690 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1c6a0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1c6b0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1c6c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c6d0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1c6e0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1c6f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1c700 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1c710 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c720 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1c730 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1c740 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1c750 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1c760 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1c770 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1c780 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1c790 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
1c7a0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1c7b0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1c7c0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1c7d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c7e0 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f  rror.  Search no
1c7f0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
1c800 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
1c810 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
1c820 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61  ALIZED);..}...ca
1c830 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1c840 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
1c850 63 74 69 76 65 20 3d 20 30 3b 0a 09 69 66 20 28  ctive = 0;..if (
1c860 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c870 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1c880 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65  _query) {...free
1c890 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1c8a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1c8b0 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d  h_query);..}...m
1c8c0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1c8d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1c8e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1c8f0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1c900 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1c910 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c920 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1c930 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1c940 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1c950 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1c960 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1c970 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1c980 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1c990 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1c9a0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1c9b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1c9c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
1c9d0 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  ptInit)(CK_SESSI
1c9e0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1c9f0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
1ca00 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
1ca10 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1ca20 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
1ca30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ca40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1ca50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1ca60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1ca70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ca80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1ca90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1caa0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1cab0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1cac0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1cad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1cae0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1caf0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1cb00 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1cb10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1cb20 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1cb30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1cb40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1cb50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1cb60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
1cb70 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ypt)(CK_SESSION_
1cb80 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1cb90 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
1cba0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
1cbb0 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
1cbc0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
1cbd0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
1cbe0 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74   pulEncryptedDat
1cbf0 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  aLen) {..CACKEY_
1cc00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1cc10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1cc20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1cc30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1cc40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cc50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1cc60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1cc70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1cc80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1cc90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1cca0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1ccb0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1ccc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1ccd0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1cce0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1ccf0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1cd00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1cd10 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1cd20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1cd30 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
1cd40 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
1cd50 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1cd60 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1cd70 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
1cd80 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42   ulPartLen, CK_B
1cd90 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
1cda0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
1cdb0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
1cdc0 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
1cdd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cde0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1cdf0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1ce00 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1ce10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ce20 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1ce30 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1ce40 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1ce50 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1ce60 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1ce70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ce80 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1ce90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1cea0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1ceb0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1cec0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1ced0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1cee0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1cef0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1cf00 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
1cf10 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53  cryptFinal)(CK_S
1cf20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1cf30 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1cf40 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74  PTR pLastEncrypt
1cf50 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
1cf60 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72  _PTR pulLastEncr
1cf70 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
1cf80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cf90 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1cfa0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1cfb0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1cfc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cfd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1cfe0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1cff0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1d000 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1d010 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1d020 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d030 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1d040 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1d050 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1d060 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1d070 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1d080 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1d090 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1d0a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d0b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d0c0 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28 43  C_DecryptInit)(C
1d0d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1d0e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
1d0f0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
1d100 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
1d110 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
1d120 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1d130 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
1d140 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d150 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1d160 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1d170 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1d180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d190 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1d1a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1d1b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1d1c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1d1d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1d1e0 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
1d1f0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1d200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d210 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
1d220 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1d230 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1d240 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1d250 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
1d260 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
1d270 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
1d280 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d290 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
1d2a0 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
1d2b0 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
1d2c0 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29  s CKM_RSA_PKCS")
1d2d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d2e0 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f  MECHANISM_PARAM_
1d2f0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1d300 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
1d310 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
1d320 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1d330 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1d340 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1d350 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1d360 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d370 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1d380 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
1d390 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1d3a0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1d3b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1d3c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1d3d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1d3e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1d3f0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1d400 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1d410 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d420 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1d430 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1d440 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1d450 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1d460 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1d470 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1d480 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1d490 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1d4a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1d4b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1d4c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d4d0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1d4e0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1d4f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1d500 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1d510 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1d520 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d530 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
1d540 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1d550 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1d560 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1d570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d580 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
1d590 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20  rypt already in 
1d5a0 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a  progress.");....
1d5b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
1d5c0 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
1d5d0 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d  .}...if (hKey >=
1d5e0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1d5f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1d600 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
1d610 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1d620 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1d630 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1d640 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d650 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65  ror.  Key handle
1d660 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72   out of range (r
1d670 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75  equested key %lu
1d680 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74  , only %lu ident
1d690 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29  ities available)
1d6a0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1d6b0 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67  ng) hKey, (unsig
1d6c0 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79  ned long) cackey
1d6d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d6e0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
1d6f0 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
1d700 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f  (CKR_KEY_HANDLE_
1d710 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
1d720 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1d730 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
1d740 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63  _active = 1;...c
1d750 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1d760 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
1d770 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65  _mechanism = pMe
1d780 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
1d790 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  sm;..cackey_sess
1d7a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
1d7b0 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
1d7c0 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70   = pMechanism->p
1d7d0 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b  Parameter;..cack
1d7e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d7f0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
1d800 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65  ch_parmlen = pMe
1d810 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d  chanism->ulParam
1d820 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79  eterLen;..cackey
1d830 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d840 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
1d850 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73  tity = &cackey_s
1d860 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d870 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65  ].identities[hKe
1d880 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y];...mutex_retv
1d890 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1d8a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1d8b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1d8c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1d8d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d8e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d8f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1d900 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1d910 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1d920 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1d930 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d940 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1d950 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1d960 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1d970 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d980 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d990 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45  C_Decrypt)(CK_SE
1d9a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1d9b0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1d9c0 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  TR pEncryptedDat
1d9d0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  a, CK_ULONG ulEn
1d9e0 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20  cryptedDataLen, 
1d9f0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
1da00 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
1da10 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
1da20 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f  K_ULONG datalen_
1da30 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f  update, datalen_
1da40 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65  final;..CK_RV de
1da50 63 72 79 70 74 5f 72 65 74 3b 0a 0a 09 43 41 43  crypt_ret;...CAC
1da60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1da70 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1da80 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1da90 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1daa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1dab0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1dac0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1dad0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1dae0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1daf0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
1db00 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c  ulDataLen == NUL
1db10 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1db20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1db30 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73  r. pulDataLen is
1db40 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1db50 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1db60 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74  S_BAD);..}...dat
1db70 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70  alen_update = *p
1db80 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63  ulDataLen;...dec
1db90 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63  rypt_ret = C_Dec
1dba0 72 79 70 74 55 70 64 61 74 65 28 68 53 65 73 73  ryptUpdate(hSess
1dbb0 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44  ion, pEncryptedD
1dbc0 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  ata, ulEncrypted
1dbd0 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20  DataLen, pData, 
1dbe0 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29  &datalen_update)
1dbf0 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ;..if (decrypt_r
1dc00 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
1dc10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dc20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
1dc30 65 63 72 79 70 74 55 70 64 61 74 65 28 29 20 72  ecryptUpdate() r
1dc40 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
1dc50 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
1dc60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65  nsigned long) de
1dc70 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72  crypt_ret);....r
1dc80 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65  eturn(decrypt_re
1dc90 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61  t);..}...if (pDa
1dca0 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d  ta) {...pData +=
1dcb0 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b   datalen_update;
1dcc0 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e  ..}..datalen_fin
1dcd0 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e  al = *pulDataLen
1dce0 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74   - datalen_updat
1dcf0 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74  e;...decrypt_ret
1dd00 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61   = C_DecryptFina
1dd10 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74  l(hSession, pDat
1dd20 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61  a, &datalen_fina
1dd30 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74  l);..if (decrypt
1dd40 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
1dd50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1dd60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dd70 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20   DecryptFinal() 
1dd80 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
1dd90 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
1dda0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
1ddb0 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09  ecrypt_ret);....
1ddc0 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72  return(decrypt_r
1ddd0 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61  et);..}...*pulDa
1dde0 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f  taLen = datalen_
1ddf0 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e  update + datalen
1de00 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  _final;...CACKEY
1de10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1de20 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1de30 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1de40 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1de50 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1de60 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1de70 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 29 28  _DecryptUpdate)(
1de80 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1de90 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1dea0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
1deb0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
1dec0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
1ded0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
1dee0 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
1def0 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
1df00 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
1df10 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09  TE buf[16384];..
1df20 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a  ssize_t buflen;.
1df30 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
1df40 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1df50 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  R;..int mutex_re
1df60 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
1df70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1df80 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1df90 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1dfa0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1dfb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1dfc0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1dfd0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1dfe0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1dff0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1e000 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
1e010 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
1e020 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
1e030 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1e040 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1e050 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
1e060 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e070 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1e080 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
1e090 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
1e0a0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1e0b0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1e0c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72  ;..}...if (pEncr
1e0d0 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c  yptedPart == NUL
1e0e0 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64  L && ulEncrypted
1e0f0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
1e100 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
1e110 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b  it if we are ask
1e120 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f  ed to decrypt no
1e130 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41  thing... */...CA
1e140 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e150 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e160 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
1e170 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
1e180 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
1e190 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
1e1a0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d  pEncryptedPart =
1e1b0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1e1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e1d0 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74  "Error. pEncrypt
1e1e0 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20  edPart is NULL, 
1e1f0 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50  but ulEncryptedP
1e200 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e  artLen is not 0.
1e210 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e220 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1e230 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63  ;..}...if (ulEnc
1e240 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d  ryptedPartLen ==
1e250 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1e260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e270 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50  or. ulEncryptedP
1e280 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74  artLen is 0, but
1e290 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55   pPart is not NU
1e2a0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1e2b0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1e2c0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  AD);..}...if (pu
1e2d0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  lPartLen == NULL
1e2e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e2f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e300 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  . pulPartLen is 
1e310 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1e320 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1e330 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  _BAD);..}...mute
1e340 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1e350 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1e360 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1e370 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1e380 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1e390 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e3a0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1e3b0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1e3c0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1e3d0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1e3e0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1e3f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1e400 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1e410 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e420 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1e430 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e440 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1e450 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1e460 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1e470 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1e480 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1e490 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1e4a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1e4b0 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
1e4c0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1e4d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1e4e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1e4f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e500 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
1e510 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  t not active.");
1e520 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1e530 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
1e540 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1e550 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79  ..switch (cackey
1e560 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1e570 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
1e580 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20  anism) {...case 
1e590 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
1e5a0 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20  ./* Ask card to 
1e5b0 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 62 75  decrypt */....bu
1e5c0 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69  flen = cackey_si
1e5d0 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65  gndecrypt(&cacke
1e5e0 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73  y_slots[cackey_s
1e5f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1e600 5d 2e 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  ].slotID], cacke
1e610 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e620 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
1e630 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65  ntity, pEncrypte
1e640 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74  dPart, ulEncrypt
1e650 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20  edPartLen, buf, 
1e660 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20  sizeof(buf), 0, 
1e670 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c  1);.....if (bufl
1e680 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a  en < 0) {...../*
1e690 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c   Decryption fail
1e6a0 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  ed. */.....retva
1e6b0 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
1e6c0 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65  ERROR;....} else
1e6d0 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
1e6e0 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20  long) buflen) > 
1e6f0 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70  *pulPartLen && p
1e700 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44  Part) {...../* D
1e710 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f  ecrypted data to
1e720 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72  o large */.....r
1e730 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
1e740 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09  ER_TOO_SMALL;...
1e750 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66  .} else {.....if
1e760 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09   (pPart) {......
1e770 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75  memcpy(pPart, bu
1e780 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  f, buflen);.....
1e790 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c  }......*pulPartL
1e7a0 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09  en = buflen;....
1e7b0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
1e7c0 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
1e7d0 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
1e7e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1e7f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1e800 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1e810 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1e820 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1e830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e840 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1e850 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1e860 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1e870 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1e880 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e890 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
1e8a0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
1e8b0 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
1e8c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1e8d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1e8e0 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _DecryptFinal)(C
1e8f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1e900 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1e910 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74  TE_PTR pLastPart
1e920 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1e930 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b  ulLastPartLen) {
1e940 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1e950 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61  al;..int termina
1e960 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a  te_decrypt = 1;.
1e970 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e980 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1e990 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1e9a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1e9b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e9c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1e9d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1e9e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e9f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1ea00 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1ea10 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1ea20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1ea30 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1ea40 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1ea50 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1ea60 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1ea70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ea80 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1ea90 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1eaa0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1eab0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1eac0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1ead0 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74  .if (pulLastPart
1eae0 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
1eaf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1eb00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
1eb10 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e  LastPartLen is N
1eb20 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1eb30 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1eb40 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
1eb50 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1eb60 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1eb70 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1eb80 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1eb90 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1eba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ebb0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1ebc0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ebd0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ebe0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1ebf0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1ec00 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1ec10 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1ec20 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ec30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1ec40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ec50 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1ec60 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1ec70 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1ec80 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1ec90 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1eca0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1ecb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ecc0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
1ecd0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1ece0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1ecf0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1ed00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ed10 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
1ed20 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1ed30 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1ed40 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
1ed50 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1ed60 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e  .*pulLastPartLen
1ed70 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73   = 0;...if (pLas
1ed80 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  tPart == NULL) {
1ed90 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  ...terminate_dec
1eda0 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  rypt = 0;..}...i
1edb0 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  f (terminate_dec
1edc0 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  rypt) {...cackey
1edd0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1ede0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
1edf0 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  ve = 0;..}...mut
1ee00 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1ee10 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1ee20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ee30 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1ee40 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1ee50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ee60 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1ee70 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1ee80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1ee90 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1eea0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1eeb0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1eec0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1eed0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1eee0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1eef0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1ef00 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49  CK_RV, C_DigestI
1ef10 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
1ef20 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1ef30 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
1ef40 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  R pMechanism) {.
1ef50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ef60 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1ef70 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1ef80 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1ef90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1efa0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1efb0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1efc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1efd0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1efe0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1eff0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f000 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1f010 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1f020 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1f030 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1f040 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1f050 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1f060 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f070 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1f080 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f090 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53  C_Digest)(CK_SES
1f0a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1f0b0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1f0c0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
1f0d0 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
1f0e0 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
1f0f0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1f100 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
1f110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f120 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f130 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f140 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f150 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f160 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f170 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f180 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f190 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f1a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1f1b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f1c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f1d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f1e0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1f1f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f200 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1f210 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1f220 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f230 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1f240 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1f250 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  _DigestUpdate)(C
1f260 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1f270 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1f280 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
1f290 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
1f2a0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1f2b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1f2c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1f2d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1f2e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f2f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f300 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1f310 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f320 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1f330 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1f340 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f350 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1f360 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1f370 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1f380 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1f390 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1f3a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1f3b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1f3c0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1f3d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1f3e0 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29  RV, C_DigestKey)
1f3f0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1f400 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1f410 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
1f420 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
1f430 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1f440 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1f450 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1f460 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f470 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f480 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1f490 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1f4a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1f4b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1f4c0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1f4d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f4e0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1f4f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1f500 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1f510 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f520 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f530 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1f540 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1f550 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1f560 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69  K_RV, C_DigestFi
1f570 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
1f580 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1f590 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69   CK_BYTE_PTR pDi
1f5a0 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  gest, CK_ULONG_P
1f5b0 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29  TR pulDigestLen)
1f5c0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1f5d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1f5e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1f5f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f600 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f610 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f620 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f630 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f640 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f650 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f660 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f670 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1f680 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1f690 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1f6a0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1f6b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1f6c0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1f6d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1f6e0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1f6f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1f700 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43  V, C_SignInit)(C
1f710 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1f720 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
1f730 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
1f740 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
1f750 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
1f760 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1f770 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
1f780 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f790 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f7a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f7b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f7c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f7d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f7e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f7f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f800 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f810 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1f820 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
1f830 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1f840 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f850 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
1f860 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1f870 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1f880 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1f890 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
1f8a0 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
1f8b0 5f 52 53 41 5f 50 4b 43 53 20 26 26 20 70 4d 65  _RSA_PKCS && pMe
1f8c0 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
1f8d0 73 6d 20 21 3d 20 43 4b 4d 5f 53 48 41 31 5f 52  sm != CKM_SHA1_R
1f8e0 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43  SA_PKCS) {...CAC
1f8f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f900 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
1f910 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e  ism->mechanism n
1f920 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
1f930 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 6f 72 20  CKM_RSA_PKCS or 
1f940 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43  CKM_SHA1_RSA_PKC
1f950 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  S");....return(C
1f960 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52  KR_MECHANISM_PAR
1f970 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  AM_INVALID);..}.
1f980 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1f990 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1f9a0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1f9b0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1f9c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1f9d0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1f9e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f9f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1fa00 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1fa10 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1fa20 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1fa30 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1fa40 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1fa50 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1fa60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1fa70 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1fa80 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1fa90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1faa0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1fab0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1fac0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1fad0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1fae0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1faf0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1fb00 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
1fb10 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1fb20 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1fb30 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1fb40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fb50 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
1fb60 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1fb70 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1fb80 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1fb90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
1fba0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1fbb0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
1fbc0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1fbd0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1fbe0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1fbf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fc00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
1fc10 6e 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f  n already in pro
1fc20 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72  gress.");......r
1fc30 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
1fc40 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a  ION_ACTIVE);..}.
1fc50 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61  ..if (hKey >= ca
1fc60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1fc70 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1fc80 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61  es_count) {...ca
1fc90 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1fca0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1fcb0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1fcc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1fcd0 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75  .  Key handle ou
1fce0 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75  t of range (requ
1fcf0 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f  ested key %lu, o
1fd00 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69  nly %lu identiti
1fd10 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c  es available).",
1fd20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1fd30 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64   hKey, (unsigned
1fd40 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65   long) cackey_se
1fd50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1fd60 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
1fd70 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
1fd80 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56  R_KEY_HANDLE_INV
1fd90 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
1fda0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1fdb0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
1fdc0 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f  e = 1;...cackey_
1fdd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1fde0 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
1fdf0 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  m = pMechanism->
1fe00 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63  mechanism;...cac
1fe10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1fe20 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
1fe30 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65  en = 128;..cacke
1fe40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1fe50 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
1fe60 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73  d = 0;..cackey_s
1fe70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1fe80 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c  ].sign_buf = mal
1fe90 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b  loc(sizeof(*cack
1fea0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1feb0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20  sion].sign_buf) 
1fec0 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  * cackey_session
1fed0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
1fee0 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b  _buflen);...CACK
1fef0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ff00 22 53 65 73 73 69 6f 6e 20 25 6c 75 20 73 69 67  "Session %lu sig
1ff10 6e 5f 69 64 65 6e 74 69 74 79 20 69 73 20 25 70  n_identity is %p
1ff20 20 28 69 64 65 6e 74 69 74 79 20 23 25 6c 75 29   (identity #%lu)
1ff30 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1ff40 67 29 20 68 53 65 73 73 69 6f 6e 2c 20 26 63 61  g) hSession, &ca
1ff50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1ff60 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1ff70 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67  es[hKey], (unsig
1ff80 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b  ned long) hKey);
1ff90 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1ffa0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
1ffb0 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  _identity = &cac
1ffc0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1ffd0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1ffe0 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78  s[hKey];...mutex
1fff0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
20000 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20010 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
20020 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
20030 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
20040 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20050 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
20060 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
20070 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
20080 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
20090 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
200a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
200b0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
200c0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
200d0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
200e0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
200f0 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f  _RV, C_Sign)(CK_
20100 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
20110 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
20120 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
20130 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
20140 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
20150 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
20160 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
20170 65 4c 65 6e 29 20 7b 0a 09 43 4b 5f 52 56 20 73  eLen) {..CK_RV s
20180 69 67 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ign_ret;...CACKE
20190 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
201a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
201b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
201c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
201d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
201e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
201f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20200 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20210 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20220 44 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65  D);..}...sign_re
20230 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65  t = C_SignUpdate
20240 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61  (hSession, pData
20250 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a 09 69  , ulDataLen);..i
20260 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43  f (sign_ret != C
20270 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  KR_OK) {...CACKE
20280 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20290 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70 64 61  Error.  SignUpda
202a0 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  te() returned fa
202b0 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
202c0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
202d0 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a  ng) sign_ret);..
202e0 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
202f0 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65  t);..}...sign_re
20300 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28  t = C_SignFinal(
20310 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61  hSession, pSigna
20320 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75  ture, pulSignatu
20330 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67  reLen);..if (sig
20340 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  n_ret != CKR_OK)
20350 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20360 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20370 20 20 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65    SignFinal() re
20380 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
20390 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
203a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
203b0 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  n_ret);....retur
203c0 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a  n(sign_ret);..}.
203d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
203e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
203f0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
20400 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
20410 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
20420 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20430 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64  CK_RV, C_SignUpd
20440 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
20450 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
20460 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
20470 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
20480 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d  artLen) {..int m
20490 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
204a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
204b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
204c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
204d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
204e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
204f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20500 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20510 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20520 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
20530 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
20540 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
20550 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
20560 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
20570 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
20580 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20590 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
205a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
205b0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
205c0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
205d0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
205e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
205f0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
20600 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20   (pPart == NULL 
20610 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  && ulPartLen == 
20620 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
20630 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72  circuit if we ar
20640 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20  e asked to sign 
20650 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
20660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20670 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20680 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
20690 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
206a0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
206b0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
206c0 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29   (pPart == NULL)
206d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
206e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
206f0 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20   pPart is NULL, 
20700 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  but ulPartLen is
20710 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
20720 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
20730 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
20740 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30   (ulPartLen == 0
20750 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20760 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20770 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30  . ulPartLen is 0
20780 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e  , but pPart is n
20790 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
207a0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
207b0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
207c0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
207d0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
207e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
207f0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
20800 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
20810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20820 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
20830 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
20840 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
20850 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
20860 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
20870 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
20880 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
20890 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
208a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
208b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
208c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
208d0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
208e0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
208f0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
20900 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
20910 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
20920 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20930 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
20940 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
20950 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20960 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
20970 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20980 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
20990 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
209a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
209b0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
209c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
209d0 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
209e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
209f0 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
20a00 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
20a10 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63  A_PKCS:..../* Ac
20a20 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c  cumulate directl
20a30 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63  y */....if ((cac
20a40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20a50 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
20a60 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29  sed + ulPartLen)
20a70 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   > cackey_sessio
20a80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
20a90 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09  n_buflen) {.....
20aa0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20ab0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
20ac0 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09  uflen *= 2;.....
20ad0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20ae0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
20af0 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61  buf = realloc(ca
20b00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20b10 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
20b20 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  , sizeof(*cackey
20b30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20b40 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20  on].sign_buf) * 
20b50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20b60 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
20b70 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09  uflen);....}....
20b80 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
20b90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20ba0 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63  ].sign_buf + cac
20bb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20bc0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
20bd0 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61  sed, pPart, ulPa
20be0 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b  rtLen);.....cack
20bf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20c00 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
20c10 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b  ed += ulPartLen;
20c20 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  .....break;...ca
20c30 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f  se CKM_SHA1_RSA_
20c40 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75  PKCS:..../* Accu
20c50 6d 75 6c 61 74 65 20 69 6e 74 6f 20 61 20 53 48  mulate into a SH
20c60 41 31 20 68 61 73 68 20 2a 2f 0a 09 09 09 63 61  A1 hash */....ca
20c70 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
20c80 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
20c90 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
20ca0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20cb0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
20cc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20cd0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
20ce0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20cf0 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ED);.....return(
20d00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20d10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 09 09  _SUPPORTED);....
20d20 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65  break;..}...mute
20d30 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
20d40 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
20d50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
20d60 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
20d70 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
20d80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20d90 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
20da0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
20db0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
20dc0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
20dd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20de0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20df0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
20e00 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
20e10 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
20e20 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
20e30 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61  K_RV, C_SignFina
20e40 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
20e50 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
20e60 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
20e70 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
20e80 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
20e90 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
20ea0 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31 30  K_BYTE sigbuf[10
20eb0 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69  24];..ssize_t si
20ec0 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 52 56 20  gbuflen;..CK_RV 
20ed0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
20ee0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74  ERAL_ERROR;..int
20ef0 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20   terminate_sign 
20f00 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  = 1;..int mutex_
20f10 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
20f20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
20f30 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
20f40 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
20f50 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20f60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20f70 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20f80 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20f90 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20fa0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20fb0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53  );..}...if (pulS
20fc0 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e  ignatureLen == N
20fd0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
20fe0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20ff0 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72  ror. pulSignatur
21000 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  eLen is NULL.");
21010 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
21020 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
21030 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
21040 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
21050 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
21060 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
21070 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
21080 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
21090 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
210a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
210b0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
210c0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
210d0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
210e0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
210f0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
21100 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
21110 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
21120 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
21130 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
21140 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21150 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21160 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
21170 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21180 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
21190 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
211a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
211b0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
211c0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
211d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
211e0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
211f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21200 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
21210 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
21220 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
21230 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
21240 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
21250 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21260 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
21270 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
21280 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21290 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
212a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
212b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
212c0 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  Sign not active.
212d0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
212e0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
212f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
21300 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63  .}...switch (cac
21310 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
21320 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68  ssion].sign_mech
21330 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20  anism) {...case 
21340 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
21350 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20  ./* Ask card to 
21360 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b 45  sign */....CACKE
21370 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21380 41 73 6b 69 6e 67 20 74 6f 20 64 65 63 72 79 70  Asking to decryp
21390 74 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20  t from identity 
213a0 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c  %p in session %l
213b0 75 22 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  u", cackey_sessi
213c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
213d0 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e  gn_identity, (un
213e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65  signed long) hSe
213f0 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75  ssion);....sigbu
21400 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69  flen = cackey_si
21410 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65  gndecrypt(&cacke
21420 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73  y_slots[cackey_s
21430 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21440 5d 2e 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  ].slotID], cacke
21450 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21460 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69  ion].sign_identi
21470 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ty, cackey_sessi
21480 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
21490 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73  gn_buf, cackey_s
214a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
214b0 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 2c 20 73  ].sign_buflen, s
214c0 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69  igbuf, sizeof(si
214d0 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09  gbuf), 1, 0);...
214e0 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
214f0 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69  < 0) {...../* Si
21500 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f  gning failed. */
21510 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
21520 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
21530 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28  ....} else if ((
21540 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
21550 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75  sigbuflen) > *pu
21560 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 26  lSignatureLen &&
21570 20 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09   pSignature) {..
21580 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 74  .../* Signed dat
21590 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09  a too large */..
215a0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
215b0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
215c0 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65  ;......terminate
215d0 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20  _sign = 0;....} 
215e0 65 6c 73 65 20 7b 0a 09 09 09 09 74 65 72 6d 69  else {.....termi
215f0 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a  nate_sign = 0;..
21600 09 09 09 09 69 66 20 28 70 53 69 67 6e 61 74 75  ....if (pSignatu
21610 72 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  re) {......memcp
21620 79 28 70 53 69 67 6e 61 74 75 72 65 2c 20 73 69  y(pSignature, si
21630 67 62 75 66 2c 20 73 69 67 62 75 66 6c 65 6e 29  gbuf, sigbuflen)
21640 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e 61 74  ;.......terminat
21650 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09  e_sign = 1;.....
21660 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67 6e 61  }......*pulSigna
21670 74 75 72 65 4c 65 6e 20 3d 20 73 69 67 62 75 66  tureLen = sigbuf
21680 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  len;......retval
21690 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a   = CKR_OK;....}.
216a0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
216b0 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50  e CKM_SHA1_RSA_P
216c0 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d  KCS:..../* Accum
216d0 75 6c 61 74 65 20 69 6e 74 6f 20 61 20 53 48 41  ulate into a SHA
216e0 31 20 68 61 73 68 20 2a 2f 0a 09 09 09 63 61 63  1 hash */....cac
216f0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21700 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21710 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
21720 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21730 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21740 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21750 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
21760 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21770 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  D);.....return(C
21780 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21790 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 09 09 62  SUPPORTED);....b
217a0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74  reak;..}...if (t
217b0 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b  erminate_sign) {
217c0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
217d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
217e0 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09  .sign_buf) {....
217f0 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
21800 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
21810 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09  ign_buf);...}...
21820 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
21830 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
21840 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
21850 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
21860 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
21870 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21880 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
21890 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
218a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
218b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
218c0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
218d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
218e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
218f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21900 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21910 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20  ning %i", (int) 
21920 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
21930 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b  n(retval);.}..CK
21940 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
21950 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65  (CK_RV, C_SignRe
21960 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45  coverInit)(CK_SE
21970 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21980 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
21990 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
219a0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
219b0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
219c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
219d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
219e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
219f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21a10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
21a20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21a30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21a40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
21a50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
21a60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21a70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
21a80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21a90 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
21aa0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21ab0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
21ac0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
21ad0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21ae0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21af0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
21b00 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53  ignRecover)(CK_S
21b10 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
21b20 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
21b30 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
21b40 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
21b50 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
21b60 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
21b70 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
21b80 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
21b90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
21ba0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
21bb0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21bc0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21bd0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21be0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21bf0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21c00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21c10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21c20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21c30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21c40 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21c50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21c60 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
21c70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21c80 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
21c90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21ca0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
21cb0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
21cc0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49  CK_RV, C_VerifyI
21cd0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
21ce0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
21cf0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
21d00 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
21d10 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
21d20 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
21d30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
21d40 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
21d50 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21d60 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21d70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21d80 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21d90 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21da0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21db0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21dc0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21dd0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21de0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21df0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21e00 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
21e10 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21e20 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
21e30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21e40 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
21e50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
21e60 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29  CK_RV, C_Verify)
21e70 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
21e80 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
21e90 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
21ea0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
21eb0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
21ec0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
21ed0 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
21ee0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
21ef0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
21f00 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
21f10 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21f20 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21f30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21f40 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21f50 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21f60 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21f70 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21f80 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21f90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21fa0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21fb0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21fc0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
21fd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21fe0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
21ff0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22000 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
22010 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
22020 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55  CK_RV, C_VerifyU
22030 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
22040 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
22050 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
22060 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
22070 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
22080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22090 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
220a0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
220b0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
220c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
220d0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
220e0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
220f0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
22100 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
22110 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
22120 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22130 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
22140 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22150 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
22160 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22170 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
22180 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
22190 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
221a0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
221b0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
221c0 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45  rifyFinal)(CK_SE
221d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
221e0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
221f0 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
22200 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74  K_ULONG ulSignat
22210 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ureLen) {..CACKE
22220 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22230 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
22240 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
22250 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
22260 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22270 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
22280 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
22290 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
222a0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
222b0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
222c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
222d0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
222e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
222f0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
22300 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22310 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
22320 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22330 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
22340 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
22350 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
22360 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43  fyRecoverInit)(C
22370 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22380 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
22390 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
223a0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
223b0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
223c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
223d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
223e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
223f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22410 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22420 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22430 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22440 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22450 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22460 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22470 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22480 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22490 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
224a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
224b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
224c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
224d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
224e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
224f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22500 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
22510 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
22520 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
22530 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
22540 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
22550 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43  lSignatureLen, C
22560 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
22570 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
22580 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41  ulDataLen) {..CA
22590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
225a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
225b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
225c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
225d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
225e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
225f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22600 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22610 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22620 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
22630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22640 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
22650 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22660 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
22670 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22680 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
22690 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
226a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
226b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
226c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
226d0 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
226e0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
226f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
22700 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
22710 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
22720 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
22730 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
22740 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
22750 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
22760 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
22770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22780 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
22790 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
227a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
227b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
227c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
227d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
227e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
227f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
22800 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
22810 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22820 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
22830 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
22840 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
22850 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22860 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
22870 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22880 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
22890 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
228a0 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
228b0 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b  DigestUpdate)(CK
228c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
228d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
228e0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
228f0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
22900 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
22910 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
22920 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
22930 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
22940 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22950 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22960 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22970 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22990 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
229a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
229b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
229c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
229d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
229e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
229f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22a00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22a10 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
22a20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22a30 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
22a40 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(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 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
22a70 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22a80 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70   C_SignEncryptUp
22a90 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
22aa0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
22ab0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
22ac0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
22ad0 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
22ae0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
22af0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
22b00 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
22b10 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
22b20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
22b30 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
22b40 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
22b50 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22b60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22b70 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22b80 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22b90 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22ba0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22bb0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
22bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
22bd0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
22be0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22bf0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
22c00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22c10 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
22c20 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22c30 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
22c40 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
22c50 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
22c60 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28  ptVerifyUpdate)(
22c70 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22c80 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
22c90 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
22ca0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
22cb0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
22cc0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
22cd0 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
22ce0 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
22cf0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
22d00 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22d10 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22d20 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22d30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22d40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22d50 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22d60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22d70 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22d80 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22d90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22da0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
22db0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22dc0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
22dd0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
22de0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
22df0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
22e00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22e10 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
22e20 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22e30 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  V, C_GenerateKey
22e40 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
22e50 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
22e60 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
22e70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54  Mechanism, CK_AT
22e80 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
22e90 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
22ea0 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
22eb0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
22ec0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
22ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22ee0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
22ef0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
22f00 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
22f10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22f20 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
22f30 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
22f40 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
22f50 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
22f60 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
22f70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22f80 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
22f90 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
22fa0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
22fb0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22fc0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
22fd0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22fe0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
22ff0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23000 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
23010 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53  eKeyPair)(CK_SES
23020 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
23030 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
23040 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
23050 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  m, CK_ATTRIBUTE_
23060 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65  PTR pPublicKeyTe
23070 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
23080 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72   ulPublicKeyAttr
23090 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41  ibuteCount, CK_A
230a0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72  TTRIBUTE_PTR pPr
230b0 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65  ivateKeyTemplate
230c0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69  , CK_ULONG ulPri
230d0 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65  vateKeyAttribute
230e0 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
230f0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75  _HANDLE_PTR phPu
23100 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  blicKey, CK_OBJE
23110 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
23120 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43  PrivateKey) {..C
23130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23140 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23150 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23160 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23170 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23180 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23190 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
231a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
231b0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
231c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
231d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
231e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
231f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23200 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
23210 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23220 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
23230 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
23240 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
23250 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
23260 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
23270 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53  WrapKey)(CK_SESS
23280 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23290 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
232a0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
232b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
232c0 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c  LE hWrappingKey,
232d0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
232e0 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f  E hKey, CK_BYTE_
232f0 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c  PTR pWrappedKey,
23300 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
23310 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20  lWrappedKeyLen) 
23320 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
23330 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
23340 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
23350 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
23360 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23370 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
23380 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
23390 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
233a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
233b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
233c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
233d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
233e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
233f0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
23400 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
23410 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
23420 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
23430 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23440 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
23450 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
23460 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43  , C_UnwrapKey)(C
23470 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
23480 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
23490 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
234a0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
234b0 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70  T_HANDLE hUnwrap
234c0 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45  pingKey, CK_BYTE
234d0 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79  _PTR pWrappedKey
234e0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61  , CK_ULONG ulWra
234f0 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41  ppedKeyLen, CK_A
23500 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
23510 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
23520 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e   ulAttributeCoun
23530 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
23540 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
23550 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23560 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
23570 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
23580 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
23590 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
235a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
235b0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
235c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
235d0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
235e0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
235f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23600 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23610 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23620 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
23630 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
23640 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
23650 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
23660 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23670 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
23680 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23690 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b   C_DeriveKey)(CK
236a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
236b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
236c0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
236d0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
236e0 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79  _HANDLE hBaseKey
236f0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
23700 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
23710 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75  _ULONG ulAttribu
23720 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  teCount, CK_OBJE
23730 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
23740 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
23750 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
23760 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
23770 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
23780 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
23790 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
237a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
237b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
237c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
237d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
237e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
237f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23800 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
23810 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
23820 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
23830 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23840 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
23850 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
23860 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
23870 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23880 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e  CK_RV, C_SeedRan
23890 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  dom)(CK_SESSION_
238a0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
238b0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65   CK_BYTE_PTR pSe
238c0 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  ed, CK_ULONG ulS
238d0 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  eedLen) {..CACKE
238e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
238f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
23900 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
23910 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
23920 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23930 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
23940 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
23950 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
23960 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
23970 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
23980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23990 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
239a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
239b0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
239c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
239d0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
239e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
239f0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
23a00 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
23a10 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65  ON(CK_RV, C_Gene
23a20 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53  rateRandom)(CK_S
23a30 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
23a40 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
23a50 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c  PTR pRandomData,
23a60 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64   CK_ULONG ulRand
23a70 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  omLen) {..CACKEY
23a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
23a90 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
23aa0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23ab0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
23ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23ad0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
23ae0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
23af0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
23b00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23b10 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
23b20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23b30 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
23b40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23b50 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
23b60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23b70 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
23b80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23b90 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f  SUPPORTED);.}../
23ba0 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e  * Deprecated Fun
23bb0 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49  ction */.CK_DEFI
23bc0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
23bd0 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  V, C_GetFunction
23be0 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49  Status)(CK_SESSI
23bf0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
23c00 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  on) {..CACKEY_DE
23c10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
23c20 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ed.");...CACKEY_
23c30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23c40 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
23c50 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
23c60 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  L (%i)", CKR_FUN
23c70 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
23c80 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  EL);...return(CK
23c90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
23ca0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73  ARALLEL);...hSes
23cb0 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b  sion = hSession;
23cc0 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
23cd0 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
23ce0 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70  ing */.}../* Dep
23cf0 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  recated Function
23d00 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
23d10 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
23d20 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28  CancelFunction)(
23d30 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
23d40 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
23d50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23d60 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23d70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23d80 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23d90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23da0 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c  _PARALLEL (%i)",
23db0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
23dc0 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72  T_PARALLEL);...r
23dd0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
23de0 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
23df0 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68  ;...hSession = h
23e00 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72  Session; /* Supr
23e10 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
23e20 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
23e30 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
23e40 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
23e50 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43  tFunctionList)(C
23e60 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f  K_FUNCTION_LIST_
23e70 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69  PTR_PTR ppFuncti
23e80 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55  onList) {..CK_FU
23e90 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20  NCTION_LIST_PTR 
23ea0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  pFunctionList;..
23eb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23ec0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
23ed0 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f  ...if (ppFunctio
23ee0 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  nList == NULL) {
23ef0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23f00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
23f10 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73  pFunctionList is
23f20 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
23f30 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
23f40 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75  S_BAD);..}...pFu
23f50 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c  nctionList = mal
23f60 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e  loc(sizeof(*pFun
23f70 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70  ctionList));...p
23f80 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65  FunctionList->ve
23f90 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28  rsion.major = ((
23fa0 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
23fb0 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
23fc0 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46   16) & 0xff;..pF
23fd0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
23fe0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43  sion.minor = ((C
23ff0 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
24000 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
24010 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75  8) & 0xff;...pFu
24020 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e  nctionList->C_In
24030 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69  itialize = C_Ini
24040 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74  tialize;..pFunct
24050 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c  ionList->C_Final
24060 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65  ize = C_Finalize
24070 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24080 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f  ->C_GetInfo = C_
24090 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  GetInfo;..pFunct
240a0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c  ionList->C_GetSl
240b0 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c  otList = C_GetSl
240c0 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69  otList;..pFuncti
240d0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
240e0 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f  tInfo = C_GetSlo
240f0 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  tInfo;..pFunctio
24100 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65  nList->C_GetToke
24110 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b  nInfo = C_GetTok
24120 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  enInfo;..pFuncti
24130 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f  onList->C_WaitFo
24140 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57  rSlotEvent = C_W
24150 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b  aitForSlotEvent;
24160 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
24170 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c  >C_GetMechanismL
24180 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61  ist = C_GetMecha
24190 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63  nismList;..pFunc
241a0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d  tionList->C_GetM
241b0 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43  echanismInfo = C
241c0 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66  _GetMechanismInf
241d0 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
241e0 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d  t->C_InitToken =
241f0 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70   C_InitToken;..p
24200 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
24210 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74  InitPIN = C_Init
24220 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  PIN;..pFunctionL
24230 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20  ist->C_SetPIN = 
24240 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63  C_SetPIN;..pFunc
24250 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e  tionList->C_Open
24260 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e  Session = C_Open
24270 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
24280 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
24290 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73  Session = C_Clos
242a0 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63  eSession;..pFunc
242b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73  tionList->C_Clos
242c0 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43  eAllSessions = C
242d0 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
242e0 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
242f0 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49  t->C_GetSessionI
24300 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69  nfo = C_GetSessi
24310 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  onInfo;..pFuncti
24320 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65  onList->C_GetOpe
24330 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f  rationState = C_
24340 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  GetOperationStat
24350 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
24360 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f  t->C_SetOperatio
24370 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70  nState = C_SetOp
24380 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70  erationState;..p
24390 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
243a0 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b  Login = C_Login;
243b0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
243c0 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f  >C_Logout = C_Lo
243d0 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  gout;..pFunction
243e0 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62  List->C_CreateOb
243f0 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f  ject = C_CreateO
24400 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f  bject;..pFunctio
24410 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a  nList->C_CopyObj
24420 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65  ect = C_CopyObje
24430 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
24440 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a  st->C_DestroyObj
24450 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f  ect = C_DestroyO
24460 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f  bject;..pFunctio
24470 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65  nList->C_GetObje
24480 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62  ctSize = C_GetOb
24490 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63  jectSize;..pFunc
244a0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41  tionList->C_GetA
244b0 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20  ttributeValue = 
244c0 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
244d0 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  lue;..pFunctionL
244e0 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62  ist->C_SetAttrib
244f0 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74  uteValue = C_Set
24500 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a  AttributeValue;.
24510 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
24520 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
24530 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  t = C_FindObject
24540 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  sInit;..pFunctio
24550 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
24560 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a  ects = C_FindObj
24570 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ects;..pFunction
24580 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
24590 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e  ctsFinal = C_Fin
245a0 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09  dObjectsFinal;..
245b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
245c0 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43  _EncryptInit = C
245d0 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70  _EncryptInit;..p
245e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
245f0 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72  Encrypt = C_Encr
24600 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ypt;..pFunctionL
24610 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70  ist->C_EncryptUp
24620 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74  date = C_Encrypt
24630 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
24640 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
24650 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79  tFinal = C_Encry
24660 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  ptFinal;..pFunct
24670 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
24680 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79  ptInit = C_Decry
24690 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  ptInit;..pFuncti
246a0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
246b0 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09  t = C_Decrypt;..
246c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
246d0 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d  _DecryptUpdate =
246e0 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
246f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
24700 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  ->C_DecryptFinal
24710 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61   = C_DecryptFina
24720 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
24730 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20  t->C_DigestInit 
24740 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a  = C_DigestInit;.
24750 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
24760 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67  C_Digest = C_Dig
24770 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  est;..pFunctionL
24780 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64  ist->C_DigestUpd
24790 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70  ate = C_DigestUp
247a0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
247b0 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65  List->C_DigestKe
247c0 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b  y = C_DigestKey;
247d0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
247e0 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d  >C_DigestFinal =
247f0 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a   C_DigestFinal;.
24800 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
24810 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53  C_SignInit = C_S
24820 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ignInit;..pFunct
24830 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20  ionList->C_Sign 
24840 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63  = C_Sign;..pFunc
24850 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
24860 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55  Update = C_SignU
24870 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
24880 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e  nList->C_SignFin
24890 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c  al = C_SignFinal
248a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
248b0 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49  ->C_SignRecoverI
248c0 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f  nit = C_SignReco
248d0 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  verInit;..pFunct
248e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52  ionList->C_SignR
248f0 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52  ecover = C_SignR
24900 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69  ecover;..pFuncti
24910 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
24920 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49  Init = C_VerifyI
24930 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
24940 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20  ist->C_Verify = 
24950 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63  C_Verify;..pFunc
24960 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
24970 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72  fyUpdate = C_Ver
24980 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  ifyUpdate;..pFun
24990 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
249a0 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72  ifyFinal = C_Ver
249b0 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  ifyFinal;..pFunc
249c0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
249d0 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20  fyRecoverInit = 
249e0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49  C_VerifyRecoverI
249f0 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
24a00 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63  ist->C_VerifyRec
24a10 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52  over = C_VerifyR
24a20 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69  ecover;..pFuncti
24a30 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
24a40 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  EncryptUpdate = 
24a50 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55  C_DigestEncryptU
24a60 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
24a70 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
24a80 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43  DigestUpdate = C
24a90 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
24aa0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
24ab0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72  List->C_SignEncr
24ac0 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69  yptUpdate = C_Si
24ad0 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b  gnEncryptUpdate;
24ae0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
24af0 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79  >C_DecryptVerify
24b00 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79  Update = C_Decry
24b10 70 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a  ptVerifyUpdate;.
24b20 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
24b30 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20  C_GenerateKey = 
24b40 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09  C_GenerateKey;..
24b50 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
24b60 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72  _GenerateKeyPair
24b70 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79   = C_GenerateKey
24b80 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Pair;..pFunction
24b90 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20  List->C_WrapKey 
24ba0 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46  = C_WrapKey;..pF
24bb0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55  unctionList->C_U
24bc0 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77  nwrapKey = C_Unw
24bd0 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  rapKey;..pFuncti
24be0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65  onList->C_Derive
24bf0 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65  Key = C_DeriveKe
24c00 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
24c10 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20  t->C_SeedRandom 
24c20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a  = C_SeedRandom;.
24c30 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
24c40 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
24c50 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e   = C_GenerateRan
24c60 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  dom;..pFunctionL
24c70 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69  ist->C_GetFuncti
24c80 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74  onStatus = C_Get
24c90 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a  FunctionStatus;.
24ca0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
24cb0 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
24cc0 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74   = C_CancelFunct
24cd0 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ion;..pFunctionL
24ce0 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69  ist->C_GetFuncti
24cf0 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75  onList = C_GetFu
24d00 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70  nctionList;...*p
24d10 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  pFunctionList = 
24d20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  pFunctionList;..
24d30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24d40 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24d50 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
24d60 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
24d70 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a              CKR_OK);.}..