Hex Artifact Content

Artifact 4ec2269ed9ed407d821ee1eea059636fa631bb1e:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 43 53  .#ifdef HAVE_PCS
0040: 43 4c 49 54 45 5f 48 0a 23 20 20 69 6e 63 6c 75  CLITE_H.#  inclu
0050: 64 65 20 3c 70 63 73 63 6c 69 74 65 2e 68 3e 0a  de <pcsclite.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 57 49 4e 53 43 41 52 44 5f 48 0a 23 20  VE_WINSCARD_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 73 63 61   include <winsca
0090: 72 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  rd.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 53 54 44 49 4e 54 5f  def HAVE_STDINT_
00b0: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74  H.#  include <st
00c0: 64 69 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  dint.h>.#endif.#
00d0: 69 66 64 65 66 20 48 41 56 45 5f 49 4e 54 54 59  ifdef HAVE_INTTY
00e0: 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65  PES_H.#  include
00f0: 20 3c 69 6e 74 74 79 70 65 73 2e 68 3e 0a 23 65   <inttypes.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 53 54 44 4c 49 42 5f 48 0a 23 20 20 69 6e 63  _STDLIB_H.#  inc
0120: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0130: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0140: 56 45 5f 55 4e 49 53 54 44 5f 48 0a 23 20 20 69  VE_UNISTD_H.#  i
0150: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0160: 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  >.#endif.#ifdef 
0170: 48 41 56 45 5f 53 54 52 49 4e 47 5f 48 0a 23 20  HAVE_STRING_H.# 
0180: 20 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67   include <string
0190: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
01a0: 66 20 48 41 56 45 5f 50 54 48 52 45 41 44 5f 48  f HAVE_PTHREAD_H
01b0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 74 68  .#  include <pth
01c0: 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  read.h>.#endif.#
01d0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 4d 49 54  ifdef HAVE_LIMIT
01e0: 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  S_H.#  include <
01f0: 6c 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66  limits.h>.#endif
0200: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 5a 4c 49  .#ifdef HAVE_ZLI
0210: 42 5f 48 0a 23 20 20 69 66 64 65 66 20 48 41 56  B_H.#  ifdef HAV
0220: 45 5f 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c  E_LIBZ.#    incl
0230: 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20  ude <zlib.h>.#  
0240: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69  endif.#else.#  i
0250: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23  fdef HAVE_LIBZ.#
0260: 20 20 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c      undef HAVE_L
0270: 49 42 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  IBZ.#  endif.#en
0280: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f  dif..#define CK_
0290: 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b  PTR *.#define CK
02a0: 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
02b0: 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d  (returnType, nam
02c0: 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61  e) returnType na
02d0: 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45  me.#define CK_DE
02e0: 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72  CLARE_FUNCTION(r
02f0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
0300: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65   returnType name
0310: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c  .#define CK_DECL
0320: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49  ARE_FUNCTION_POI
0330: 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c  NTER(returnType,
0340: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0350: 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69  e (* name).#defi
0360: 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46  ne CK_CALLBACK_F
0370: 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79  UNCTION(returnTy
0380: 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e  pe, name) return
0390: 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69  Type (* name).#i
03a0: 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23  fndef NULL_PTR.#
03b0: 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54    define NULL_PT
03c0: 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63  R 0.#endif..#inc
03d0: 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a  lude "pkcs11.h".
03e0: 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78  #include "asn1-x
03f0: 35 30 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20  509.h"..#ifndef 
0400: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0410: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20  VERSION_CODE.#  
0420: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52  define CACKEY_CR
0430: 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
0440: 4f 44 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e  ODE 0x021e00.#en
0450: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41  dif..#ifndef CKA
0460: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
0470: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
0480: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
0490: 54 48 20 30 78 63 65 35 33 36 33 35 38 0a 23 65  TH 0xce536358.#e
04a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
04b0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04c0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
04d0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04e0: 54 48 20 30 78 63 65 35 33 36 33 35 39 0a 23 65  TH 0xce536359.#e
04f0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
0500: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
0510: 49 4e 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b  ING.#  define CK
0520: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
0530: 4e 49 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a  NING 0xce53635a.
0540: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43  #endif.#ifndef C
0550: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
0560: 52 4f 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66  ROTECTION.#  def
0570: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ine CKA_TRUST_EM
0580: 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30  AIL_PROTECTION 0
0590: 78 63 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66  xce53635b.#endif
05a0: 0a 0a 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31  ../* GSC-IS v2.1
05b0: 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a   Definitions */.
05c0: 2f 2a 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a  /** Classes **/.
05d0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c  #define GSCIS_CL
05e0: 41 53 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20  ASS_ISO7816     
05f0: 20 20 20 20 20 20 30 78 30 30 0a 23 64 65 66 69        0x00.#defi
0600: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  ne GSCIS_CLASS_G
0610: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20  LOBAL_PLATFORM  
0620: 20 30 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72   0x80../** Instr
0630: 75 63 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66  uctions **/.#def
0640: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0650: 47 45 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20  GET_RESPONSE    
0660: 20 20 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47    0xC0.#define G
0670: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
0680: 42 49 4e 41 52 59 20 20 20 20 20 20 20 30 78 42  BINARY       0xB
0690: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06a0: 49 4e 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e  INSTR_UPDATE_BIN
06b0: 41 52 59 20 20 20 20 20 30 78 44 36 0a 23 64 65  ARY     0xD6.#de
06c0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
06d0: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
06e0: 20 20 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20     0xA4.#define 
06f0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45  GSCIS_INSTR_EXTE
0700: 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78  RNAL_AUTH     0x
0710: 38 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  82.#define GSCIS
0720: 5f 49 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c  _INSTR_GET_CHALL
0730: 45 4e 47 45 20 20 20 20 20 30 78 38 34 0a 23 64  ENGE     0x84.#d
0740: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0750: 52 5f 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20  R_INTERNAL_AUTH 
0760: 20 20 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65      0x88.#define
0770: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
0780: 49 46 59 20 20 20 20 20 20 20 20 20 20 20 20 30  IFY            0
0790: 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x20.#define GSCI
07a0: 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20  S_INSTR_SIGN    
07b0: 20 20 20 20 20 20 20 20 20 20 30 78 32 41 0a 23            0x2A.#
07c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
07d0: 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20  TR_GET_PROP     
07e0: 20 20 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e       0x56.#defin
07f0: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0800: 54 5f 41 43 52 20 20 20 20 20 20 20 20 20 20 20  T_ACR           
0810: 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43  0x4C.#define GSC
0820: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
0830: 46 46 45 52 20 20 20 20 20 20 20 30 78 35 32 0a  FFER       0x52.
0840: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0850: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20  STR_SIGNDECRYPT 
0860: 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66        0x42..#def
0870: 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f  ine GSCIS_PARAM_
0880: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20  SELECT_APPLET   
0890: 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73    0x04../** Tags
08a0: 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61   **/./*** CCC Ta
08b0: 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  gs ***/.#define 
08c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
08e0: 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  F0.#define GSCIS
08f0: 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20  _TAG_CCC_VER    
0900: 20 20 20 20 20 20 20 20 20 30 78 46 31 0a 23 64           0xF1.#d
0910: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0920: 43 43 47 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCG_VER         
0930: 20 20 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65      0xF2.#define
0940: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
0950: 52 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  RL             0
0960: 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF3.#define GSCI
0970: 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20  S_TAG_PKCS15    
0980: 20 20 20 20 20 20 20 20 20 20 30 78 46 34 0a 23            0xF4.#
0990: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09a0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20  _REG_DATA_MODEL 
09b0: 20 20 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e       0xF5.#defin
09c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
09d0: 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20  TABLE           
09e0: 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF6.#define GSC
09f0: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55  IS_TAG_CARD_APDU
0a00: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 37 0a             0xF7.
0a10: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a20: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20  G_REDIRECTION   
0a30: 20 20 20 20 20 20 30 78 46 41 0a 23 64 65 66 69        0xFA.#defi
0a40: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20  ne GSCIS_TAG_CT 
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53   0xFB.#define GS
0a70: 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20  CIS_TAG_ST      
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 43              0xFC
0a90: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0aa0: 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20  AG_NEXTCCC      
0ab0: 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a         0xFD../**
0ac0: 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32  * General - EF 2
0ad0: 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  200 ***/.#define
0ae0: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45   GSCIS_TAG_FNAME
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0b00: 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x01.#define GSCI
0b10: 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20  S_TAG_MNAME     
0b20: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0a 23            0x02.#
0b30: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b40: 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _LNAME          
0b50: 20 20 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e       0x03.#defin
0b60: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46  e GSCIS_TAG_SUFF
0b70: 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  IX              
0b80: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x04.#define GSC
0b90: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
0ba0: 43 59 20 20 20 20 20 20 20 20 20 30 78 30 35 0a  CY         0x05.
0bb0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0bc0: 47 5f 42 55 52 45 41 55 20 20 20 20 20 20 20 20  G_BUREAU        
0bd0: 20 20 20 20 20 20 30 78 30 36 0a 23 64 65 66 69        0x06.#defi
0be0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0bf0: 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EAU_CODE        
0c00: 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53   0x07.#define GS
0c10: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
0c20: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 30 38  E           0x08
0c30: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c40: 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20  AG_TITLE        
0c50: 20 20 20 20 20 20 20 30 78 30 39 0a 23 64 65 66         0x09.#def
0c60: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ine GSCIS_TAG_BU
0c70: 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20 20 20  ILDING          
0c80: 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47    0x10.#define G
0c90: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
0ca0: 41 44 44 52 31 20 20 20 20 20 20 20 20 30 78 31  ADDR1        0x1
0cb0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
0cc0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32  TAG_OFFICE_ADDR2
0cd0: 20 20 20 20 20 20 20 20 30 78 31 32 0a 23 64 65          0x12.#de
0ce0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0cf0: 46 46 49 43 45 5f 43 49 54 59 20 20 20 20 20 20  FFICE_CITY      
0d00: 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20     0x13.#define 
0d10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d20: 5f 53 54 41 54 45 20 20 20 20 20 20 20 20 30 78  _STATE        0x
0d30: 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  14.#define GSCIS
0d40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20  _TAG_OFFICE_ZIP 
0d50: 20 20 20 20 20 20 20 20 20 30 78 31 35 0a 23 64           0x15.#d
0d60: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0d70: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20  OFFICE_COUNTRY  
0d80: 20 20 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65      0x16.#define
0d90: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0da0: 45 5f 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30  E_PHONE        0
0db0: 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x17.#define GSCI
0dc0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0dd0: 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23  NE_EXT    0x18.#
0de0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0df0: 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20 20 20  _OFFICE_FAX     
0e00: 20 20 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e       0x19.#defin
0e10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e20: 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20  CE_EMAIL        
0e30: 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43  0x1A.#define GSC
0e40: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
0e50: 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31 42 0a  OM         0x1B.
0e60: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0e70: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20  G_NONGOV_AGENCY 
0e80: 20 20 20 20 20 20 30 78 31 43 0a 23 64 65 66 69        0x1C.#defi
0e90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  ne GSCIS_TAG_SSN
0ea0: 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20  _DESIGNATOR     
0eb0: 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20   0x1D../*** PII 
0ec0: 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23  - EF 2100 ***/.#
0ed0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0ee0: 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20 20 20  _SSN            
0ef0: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e       0x20.#defin
0f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20  e GSCIS_TAG_DOB 
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0x21.#define GSC
0f30: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20  IS_TAG_GENDER   
0f40: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 32 0a             0x22.
0f50: 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f  ./*** Login Info
0f60: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30  rmation - EF 400
0f70: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
0f80: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20  SCIS_TAG_USERID 
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34               0x4
0fa0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0fb0: 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20  TAG_DOMAIN      
0fc0: 20 20 20 20 20 20 20 20 30 78 34 31 0a 23 64 65          0x41.#de
0fd0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50  fine GSCIS_TAG_P
0fe0: 41 53 53 57 4f 52 44 20 20 20 20 20 20 20 20 20  ASSWORD         
0ff0: 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61     0x42../*** Ca
1000: 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  rd Information -
1010: 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 5000 ***/.#d
1020: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1030: 49 53 53 55 45 52 49 44 20 20 20 20 20 20 20 20  ISSUERID        
1040: 20 20 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65      0x50.#define
1050: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f   GSCIS_TAG_SERNO
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1070: 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x51.#define GSCI
1080: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
1090: 20 20 20 20 20 20 20 20 20 20 30 78 35 32 0a 23            0x52.#
10a0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10b0: 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 20 20  _EXPIRE_DATE    
10c0: 20 20 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e       0x53.#defin
10d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
10e0: 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20  _TYPE           
10f0: 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x54.#define GSC
1100: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
1110: 43 4f 44 45 20 20 20 20 20 20 20 30 78 35 37 0a  CODE       0x57.
1120: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1130: 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20 20 20  G_CARDID_AID    
1140: 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a        0x58../***
1150: 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e   PKI Information
1160: 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a   - EF 7000 ***/.
1170: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1180: 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 20 20  G_CERTIFICATE   
1190: 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 66 69        0x70.#defi
11a0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  ne GSCIS_TAG_CER
11b0: 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20  T_ISSUE_DATE    
11c0: 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53   0x71.#define GS
11d0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
11e0: 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 37 32  IRE_DATE    0x72
11f0: 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73  ../** Applet IDs
1200: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43   **/.#define GSC
1210: 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20  IS_AID_CCC      
1220: 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 2c             0xA0,
1230: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1240: 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30  1, 0x16, 0xDB, 0
1250: 78 30 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  x00..#ifdef CACK
1260: 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66 64 65  EY_DEBUG.#  ifde
1270: 66 20 48 41 56 45 5f 53 54 44 49 4f 5f 48 0a 23  f HAVE_STDIO_H.#
1280: 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64      include <std
1290: 69 6f 2e 68 3e 0a 23 20 20 65 6e 64 69 66 0a 0a  io.h>.#  endif..
12a0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
12b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
12c0: 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74  ..) { fprintf(st
12d0: 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20  derr, "%s():%i: 
12e0: 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  ", __func__, __L
12f0: 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28  INE__); fprintf(
1300: 73 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72 69  stderr, x); fpri
1310: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
1320: 29 3b 20 66 66 6c 75 73 68 28 73 74 64 65 72 72  ); fflush(stderr
1330: 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43  ); }.#  define C
1340: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1350: 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 7b 20  TBUF(f, x, y) { 
1360: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1370: 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65 64 20  MPBUF; unsigned 
1380: 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42 55 46  long idx; TMPBUF
1390: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
13a0: 72 20 2a 29 20 28 78 29 3b 20 66 70 72 69 6e 74  r *) (x); fprint
13b0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a  f(stderr, "%s():
13c0: 25 69 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20  %i: %s  (%s/%lu 
13d0: 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63  = {%02x", __func
13e0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c  __, __LINE__, f,
13f0: 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c   #x, (unsigned l
1400: 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46  ong) (y), TMPBUF
1410: 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d  [0]); for (idx =
1420: 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69   1; idx < (y); i
1430: 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28  dx++) { fprintf(
1440: 73 74 64 65 72 72 2c 20 22 2c 20 25 30 32 78 22  stderr, ", %02x"
1450: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20  , TMPBUF[idx]); 
1460: 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  }; fprintf(stder
1470: 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 66 66 6c 75  r, "})\n"); fflu
1480: 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23 20  sh(stderr); }.# 
1490: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
14a0: 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b  EBUG_PERROR(x) {
14b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14c0: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f   "%s():%i: ", __
14d0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
14e0: 29 3b 20 70 65 72 72 6f 72 28 78 29 3b 20 66 66  ); perror(x); ff
14f0: 6c 75 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a  lush(stderr); }.
1500: 23 20 20 64 65 66 69 6e 65 20 66 72 65 65 28 78  #  define free(x
1510: 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ) { CACKEY_DEBUG
1520: 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28 25 70  _PRINTF("FREE(%p
1530: 29 20 28 25 73 29 22 2c 20 78 2c 20 23 78 29 3b  ) (%s)", x, #x);
1540: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1550: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59  tic void *CACKEY
1560: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
1570: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  OC(size_t size, 
1580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
1590: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
15a0: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
15b0: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  etval = malloc(s
15c0: 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ize);...fprintf(
15d0: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69  stderr, "%s():%i
15e0: 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29  : ", func, line)
15f0: 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
1600: 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  r, "MALLOC() = %
1610: 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70  p", retval);..fp
1620: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1630: 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 73 74 64  n");..fflush(std
1640: 65 72 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  err);...return(r
1650: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
1660: 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44  c void *CACKEY_D
1670: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f  EBUG_FUNC_REALLO
1680: 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a  C(void *ptr, siz
1690: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
16a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
16b0: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72  line) {..void *r
16c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
16d0: 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73  = realloc(ptr, s
16e0: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76  ize);...if (retv
16f0: 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66  al != ptr) {...f
1700: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1710: 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63  %s():%i: ", func
1720: 2c 20 6c 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e  , line);...fprin
1730: 74 66 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c  tf(stderr, "REAL
1740: 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70  LOC(%p) = %p", p
1750: 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66  tr, retval);...f
1760: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1770: 5c 6e 22 29 3b 0a 09 09 66 66 6c 75 73 68 28 73  \n");...fflush(s
1780: 74 64 65 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74  tderr);..}...ret
1790: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
17a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41 43  static char *CAC
17b0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
17c0: 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61 72  TRDUP(const char
17d0: 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68 61   *ptr, const cha
17e0: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e  r *func, int lin
17f0: 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 76  e) {..char *retv
1800: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73  al;...retval = s
1810: 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66 70  trdup(ptr);...fp
1820: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
1830: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c  s():%i: ", func,
1840: 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66   line);..fprintf
1850: 28 73 74 64 65 72 72 2c 20 22 53 54 52 44 55 50  (stderr, "STRDUP
1860: 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c  _MALLOC() = %p",
1870: 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e   retval);..fprin
1880: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29  tf(stderr, "\n")
1890: 3b 0a 09 66 66 6c 75 73 68 28 73 74 64 65 72 72  ;..fflush(stderr
18a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
18b0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  al);.}..static c
18c0: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
18d0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
18e0: 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67 6e 65 64  _TO_STR(unsigned
18f0: 20 63 68 61 72 20 74 61 67 29 20 7b 0a 09 73 77   char tag) {..sw
1900: 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 63  itch (tag) {...c
1910: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
1920: 52 44 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  RDID:....return(
1930: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49  "GSCIS_TAG_CARDI
1940: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
1950: 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 3a 0a 09  S_TAG_CCC_VER:..
1960: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1970: 54 41 47 5f 43 43 43 5f 56 45 52 22 29 3b 0a 09  TAG_CCC_VER");..
1980: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1990: 43 43 47 5f 56 45 52 3a 0a 09 09 09 72 65 74 75  CCG_VER:....retu
19a0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43  rn("GSCIS_TAG_CC
19b0: 47 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  G_VER");...case 
19c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
19d0: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  L:....return("GS
19e0: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 22  CIS_TAG_CARDURL"
19f0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1a00: 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 72  TAG_PKCS15:....r
1a10: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1a20: 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09 63 61 73  _PKCS15");...cas
1a30: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
1a40: 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72  DATA_MODEL:....r
1a50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1a60: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 22  _REG_DATA_MODEL"
1a70: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1a80: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
1a90: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1aa0: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 22 29 3b  TAG_ACR_TABLE");
1ab0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1ac0: 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a 09 09 09  G_CARD_APDU:....
1ad0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1ae0: 47 5f 43 41 52 44 5f 41 50 44 55 22 29 3b 0a 09  G_CARD_APDU");..
1af0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1b00: 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a 09 09 09  REDIRECTION:....
1b10: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1b20: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 22 29 3b  G_REDIRECTION");
1b30: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1b40: 47 5f 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  G_CT:....return(
1b50: 22 47 53 43 49 53 5f 54 41 47 5f 43 54 22 29 3b  "GSCIS_TAG_CT");
1b60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1b70: 47 5f 53 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  G_ST:....return(
1b80: 22 47 53 43 49 53 5f 54 41 47 5f 53 54 22 29 3b  "GSCIS_TAG_ST");
1b90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1ba0: 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09 09 72 65  G_NEXTCCC:....re
1bb0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1bc0: 4e 45 58 54 43 43 43 22 29 3b 0a 09 09 63 61 73  NEXTCCC");...cas
1bd0: 65 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d  e GSCIS_TAG_FNAM
1be0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1bf0: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 22 29 3b  CIS_TAG_FNAME");
1c00: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c10: 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_MNAME:....retu
1c20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4d 4e  rn("GSCIS_TAG_MN
1c30: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
1c40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09  CIS_TAG_LNAME:..
1c50: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1c60: 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_LNAME");...c
1c70: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55  ase GSCIS_TAG_SU
1c80: 46 46 49 58 3a 0a 09 09 09 72 65 74 75 72 6e 28  FFIX:....return(
1c90: 22 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49  "GSCIS_TAG_SUFFI
1ca0: 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  X");...case GSCI
1cb0: 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43  S_TAG_GOVT_AGENC
1cc0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
1cd0: 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45  CIS_TAG_GOVT_AGE
1ce0: 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  NCY");...case GS
1cf0: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 3a 0a  CIS_TAG_BUREAU:.
1d00: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1d10: 5f 54 41 47 5f 42 55 52 45 41 55 22 29 3b 0a 09  _TAG_BUREAU");..
1d20: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1d30: 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a 09 09 09  BUREAU_CODE:....
1d40: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1d50: 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 22 29 3b  G_BUREAU_CODE");
1d60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d70: 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a 09 09 09  G_DEPT_CODE:....
1d80: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1d90: 47 5f 44 45 50 54 5f 43 4f 44 45 22 29 3b 0a 09  G_DEPT_CODE");..
1da0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1db0: 54 49 54 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TITLE:....return
1dc0: 28 22 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  ("GSCIS_TAG_TITL
1dd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1de0: 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 3a 0a  S_TAG_BUILDING:.
1df0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e00: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 22 29 3b  _TAG_BUILDING");
1e10: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1e20: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 3a 0a  G_OFFICE_ADDR1:.
1e30: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
1e50: 31 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  1");...case GSCI
1e60: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44  S_TAG_OFFICE_ADD
1e70: 52 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  R2:....return("G
1e80: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
1e90: 41 44 44 52 32 22 29 3b 0a 09 09 63 61 73 65 20  ADDR2");...case 
1ea0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
1eb0: 5f 43 49 54 59 3a 0a 09 09 09 72 65 74 75 72 6e  _CITY:....return
1ec0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
1ed0: 43 45 5f 43 49 54 59 22 29 3b 0a 09 09 63 61 73  CE_CITY");...cas
1ee0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1ef0: 43 45 5f 53 54 41 54 45 3a 0a 09 09 09 72 65 74  CE_STATE:....ret
1f00: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1f10: 46 46 49 43 45 5f 53 54 41 54 45 22 29 3b 0a 09  FFICE_STATE");..
1f20: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1f30: 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09 09 09 72  OFFICE_ZIP:....r
1f40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1f50: 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29 3b 0a 09  _OFFICE_ZIP");..
1f60: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1f70: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 3a 0a  OFFICE_COUNTRY:.
1f80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1f90: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e  _TAG_OFFICE_COUN
1fa0: 54 52 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TRY");...case GS
1fb0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
1fc0: 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  HONE:....return(
1fd0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1fe0: 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 63 61 73  E_PHONE");...cas
1ff0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2000: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a 0a 09 09  CE_PHONE_EXT:...
2010: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2020: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f  AG_OFFICE_PHONE_
2030: 45 58 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  EXT");...case GS
2040: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
2050: 41 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  AX:....return("G
2060: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2070: 46 41 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53  FAX");...case GS
2080: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45  CIS_TAG_OFFICE_E
2090: 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  MAIL:....return(
20a0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
20b0: 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 63 61 73  E_EMAIL");...cas
20c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
20d0: 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 65 74 75  CE_ROOM:....retu
20e0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
20f0: 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63  FICE_ROOM");...c
2100: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f  ase GSCIS_TAG_NO
2110: 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a 09 09 09  NGOV_AGENCY:....
2120: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2130: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 22  G_NONGOV_AGENCY"
2140: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2150: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
2160: 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  OR:....return("G
2170: 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53  SCIS_TAG_SSN_DES
2180: 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09 63 61 73  IGNATOR");...cas
2190: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 3a  e GSCIS_TAG_SSN:
21a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
21b0: 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a 09 09 63  S_TAG_SSN");...c
21c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f  ase GSCIS_TAG_DO
21d0: 42 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  B:....return("GS
21e0: 43 49 53 5f 54 41 47 5f 44 4f 42 22 29 3b 0a 09  CIS_TAG_DOB");..
21f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2200: 47 45 4e 44 45 52 3a 0a 09 09 09 72 65 74 75 72  GENDER:....retur
2210: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 45 4e  n("GSCIS_TAG_GEN
2220: 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  DER");...case GS
2230: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 3a 0a  CIS_TAG_USERID:.
2240: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2250: 5f 54 41 47 5f 55 53 45 52 49 44 22 29 3b 0a 09  _TAG_USERID");..
2260: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2270: 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 74 75 72  DOMAIN:....retur
2280: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d  n("GSCIS_TAG_DOM
2290: 41 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIN");...case GS
22a0: 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44  CIS_TAG_PASSWORD
22b0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
22c0: 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 22  IS_TAG_PASSWORD"
22d0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
22e0: 54 41 47 5f 49 53 53 55 45 52 49 44 3a 0a 09 09  TAG_ISSUERID:...
22f0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2300: 41 47 5f 49 53 53 55 45 52 49 44 22 29 3b 0a 09  AG_ISSUERID");..
2310: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2320: 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74 75 72 6e  SERNO:....return
2330: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  ("GSCIS_TAG_SERN
2340: 4f 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  O");...case GSCI
2350: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
2360: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2370: 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54  IS_TAG_ISSUE_DAT
2380: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2390: 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54  S_TAG_EXPIRE_DAT
23a0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
23b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
23c0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
23d0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50  CIS_TAG_CARD_TYP
23e0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
23f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50  CIS_TAG_CARD_TYP
2400: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2410: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
2420: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2430: 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49  GSCIS_TAG_SECURI
2440: 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  TY_CODE");...cas
2450: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
2460: 49 44 5f 41 49 44 3a 0a 09 09 09 72 65 74 75 72  ID_AID:....retur
2470: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52  n("GSCIS_TAG_CAR
2480: 44 49 44 5f 41 49 44 22 29 3b 0a 09 09 63 61 73  DID_AID");...cas
2490: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
24a0: 49 46 49 43 41 54 45 3a 0a 09 09 09 72 65 74 75  IFICATE:....retu
24b0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
24c0: 52 54 49 46 49 43 41 54 45 22 29 3b 0a 09 09 63  RTIFICATE");...c
24d0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
24e0: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09  RT_ISSUE_DATE:..
24f0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2500: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
2510: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
2520: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
2530: 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  IRE_DATE:....ret
2540: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
2550: 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 22  ERT_EXPIRE_DATE"
2560: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22  );..}...return("
2570: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
2580: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2590: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
25a0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
25b0: 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f 64 65 29  TR(LONG retcode)
25c0: 20 7b 0a 09 73 77 69 74 63 68 20 28 72 65 74 63   {..switch (retc
25d0: 6f 64 65 29 20 7b 0a 09 09 63 61 73 65 20 53 43  ode) {...case SC
25e0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 3a 0a 09  ARD_S_SUCCESS:..
25f0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2600: 53 5f 53 55 43 43 45 53 53 22 29 3b 0a 09 09 63  S_SUCCESS");...c
2610: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 43  ase SCARD_E_CANC
2620: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ELLED:....return
2630: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c  ("SCARD_E_CANCEL
2640: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
2650: 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f  ARD_E_CANT_DISPO
2660: 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  SE:....return("S
2670: 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50  CARD_E_CANT_DISP
2680: 4f 53 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OSE");...case SC
2690: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45  ARD_E_INSUFFICIE
26a0: 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09 09 72 65  NT_BUFFER:....re
26b0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
26c0: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
26d0: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  R");...case SCAR
26e0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 3a  D_E_INVALID_ATR:
26f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2700: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 22  D_E_INVALID_ATR"
2710: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2720: 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  E_INVALID_HANDLE
2730: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2740: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
2750: 44 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  DLE");...case SC
2760: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41  ARD_E_INVALID_PA
2770: 52 41 4d 45 54 45 52 3a 0a 09 09 09 72 65 74 75  RAMETER:....retu
2780: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
2790: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 22 29 3b  LID_PARAMETER");
27a0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
27b0: 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 3a 0a  INVALID_TARGET:.
27c0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
27d0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45  _E_INVALID_TARGE
27e0: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  T");...case SCAR
27f0: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55  D_E_INVALID_VALU
2800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
2810: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41  ARD_E_INVALID_VA
2820: 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LUE");...case SC
2830: 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a  ARD_E_NO_MEMORY:
2840: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2850: 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b  D_E_NO_MEMORY");
2860: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2870: 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 3a 0a  UNKNOWN_READER:.
2880: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2890: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45  _E_UNKNOWN_READE
28a0: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  R");...case SCAR
28b0: 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a 09 09 09  D_E_TIMEOUT:....
28c0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
28d0: 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09 63 61 73  TIMEOUT");...cas
28e0: 65 20 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e  e SCARD_E_SHARIN
28f0: 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09  G_VIOLATION:....
2900: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2910: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
2920: 4e 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  N");...case SCAR
2930: 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44  D_E_NO_SMARTCARD
2940: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2950: 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52  RD_E_NO_SMARTCAR
2960: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2970: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44  D_E_UNKNOWN_CARD
2980: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2990: 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52  RD_E_UNKNOWN_CAR
29a0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
29b0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
29c0: 43 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  CH:....return("S
29d0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
29e0: 4d 41 54 43 48 22 29 3b 0a 09 09 63 61 73 65 20  MATCH");...case 
29f0: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44  SCARD_E_NOT_READ
2a00: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  Y:....return("SC
2a10: 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 22  ARD_E_NOT_READY"
2a20: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2a30: 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c  E_SYSTEM_CANCELL
2a40: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
2a50: 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41  CARD_E_SYSTEM_CA
2a60: 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73  NCELLED");...cas
2a70: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52  e SCARD_E_NOT_TR
2a80: 41 4e 53 41 43 54 45 44 3a 0a 09 09 09 72 65 74  ANSACTED:....ret
2a90: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54  urn("SCARD_E_NOT
2aa0: 5f 54 52 41 4e 53 41 43 54 45 44 22 29 3b 0a 09  _TRANSACTED");..
2ab0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45  .case SCARD_E_RE
2ac0: 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45  ADER_UNAVAILABLE
2ad0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2ae0: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56  RD_E_READER_UNAV
2af0: 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  AILABLE");...cas
2b00: 65 20 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50  e SCARD_W_UNSUPP
2b10: 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  ORTED_CARD:....r
2b20: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55  eturn("SCARD_W_U
2b30: 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 22  NSUPPORTED_CARD"
2b40: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2b50: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43  W_UNRESPONSIVE_C
2b60: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
2b70: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
2b80: 53 49 56 45 5f 43 41 52 44 22 29 3b 0a 09 09 63  SIVE_CARD");...c
2b90: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f  ase SCARD_W_UNPO
2ba0: 57 45 52 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  WERED_CARD:....r
2bb0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55  eturn("SCARD_W_U
2bc0: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 22 29 3b  NPOWERED_CARD");
2bd0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
2be0: 52 45 53 45 54 5f 43 41 52 44 3a 0a 09 09 09 72  RESET_CARD:....r
2bf0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52  eturn("SCARD_W_R
2c00: 45 53 45 54 5f 43 41 52 44 22 29 3b 0a 09 09 63  ESET_CARD");...c
2c10: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 4d 4f  ase SCARD_W_REMO
2c20: 56 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  VED_CARD:....ret
2c30: 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 4d  urn("SCARD_W_REM
2c40: 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  OVED_CARD");...c
2c50: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 43 49 5f  ase SCARD_E_PCI_
2c60: 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72 65  TOO_SMALL:....re
2c70: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 43  turn("SCARD_E_PC
2c80: 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09  I_TOO_SMALL");..
2c90: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45  .case SCARD_E_RE
2ca0: 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44  ADER_UNSUPPORTED
2cb0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2cc0: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55  RD_E_READER_UNSU
2cd0: 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73  PPORTED");...cas
2ce0: 65 20 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43  e SCARD_E_DUPLIC
2cf0: 41 54 45 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  ATE_READER:....r
2d00: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 44  eturn("SCARD_E_D
2d10: 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 22  UPLICATE_READER"
2d20: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2d30: 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54  E_CARD_UNSUPPORT
2d40: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
2d50: 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55  CARD_E_CARD_UNSU
2d60: 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73  PPORTED");...cas
2d70: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52  e SCARD_E_NO_SER
2d80: 56 49 43 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  VICE:....return(
2d90: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56  "SCARD_E_NO_SERV
2da0: 49 43 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ICE");...case SC
2db0: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
2dc0: 4f 50 50 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  OPPED:....return
2dd0: 28 22 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43  ("SCARD_E_SERVIC
2de0: 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a 09 09 63  E_STOPPED");...c
2df0: 61 73 65 20 53 43 41 52 44 5f 57 5f 49 4e 53 45  ase SCARD_W_INSE
2e00: 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65  RTED_CARD:....re
2e10: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 49 4e  turn("SCARD_W_IN
2e20: 53 45 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  SERTED_CARD");..
2e30: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e  .case SCARD_E_UN
2e40: 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52  SUPPORTED_FEATUR
2e50: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
2e60: 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_E_UNSUPPORTE
2e70: 44 5f 46 45 41 54 55 52 45 22 29 3b 0a 09 7d 0a  D_FEATURE");..}.
2e80: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
2e90: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
2ea0: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
2eb0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
2ec0: 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36  ID_TO_STR(uint16
2ed0: 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69  _t objid) {..swi
2ee0: 74 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09  tch (objid) {...
2ef0: 63 61 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09  case 0x2000:....
2f00: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
2f10: 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c  LV_OBJID_GENERAL
2f20: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
2f30: 78 32 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x2100:....return
2f40: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
2f50: 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e  ID_PROPERSONALIN
2f60: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33  FO");...case 0x3
2f70: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
2f80: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
2f90: 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29  _ACCESSCONTROL")
2fa0: 3b 0a 09 09 63 61 73 65 20 30 78 34 30 30 30 3a  ;...case 0x4000:
2fb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2fc0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47  EY_TLV_OBJID_LOG
2fd0: 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35  IN");...case 0x5
2fe0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
2ff0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3000: 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63  _CARDINFO");...c
3010: 61 73 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72  ase 0x6000:....r
3020: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3030: 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49  V_OBJID_BIOMETRI
3040: 43 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37  CS");...case 0x7
3050: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3060: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3070: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 22  _DIGITALSIGCERT"
3080: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 30  );...case 0x0200
3090: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30a0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
30b0: 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61  C_PERSON");...ca
30c0: 73 65 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65  se 0x0202:....re
30d0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
30e0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46  _OBJID_CAC_BENEF
30f0: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ITS");...case 0x
3100: 30 32 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28  0203:....return(
3110: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3120: 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46  D_CAC_OTHERBENEF
3130: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ITS");...case 0x
3140: 30 32 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  0201:....return(
3150: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3160: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22  D_CAC_PERSONNEL"
3170: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 46 45  );...case 0x02FE
3180: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3190: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
31a0: 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a  C_PKICERT");..}.
31b0: 09 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f  ...return("UNKNO
31c0: 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  WN");.}..static 
31d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b  const char *CACK
31e0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
31f0: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e  PTYPE_TO_STR(uin
3200: 74 38 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a  t8_t apptype) {.
3210: 09 73 77 69 74 63 68 20 28 61 70 70 74 79 70 65  .switch (apptype
3220: 29 20 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a  ) {...case 0x00:
3230: 0a 09 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45  ....return("NONE
3240: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a  ");...case 0x01:
3250: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3260: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3270: 49 43 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  IC");...case 0x0
3280: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  2:....return("CA
3290: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
32a0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a  ");...case 0x03:
32b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
32c0: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
32d0: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  IC | CACKEY_TLV_
32e0: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73  APP_SKI");...cas
32f0: 65 20 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72  e 0x04:....retur
3300: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3310: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_PKI");...case 
3320: 30 78 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x05:....return(
3330: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3340: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
3350: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a  _TLV_APP_PKI");.
3360: 09 09 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09  ..case 0x06:....
3370: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3380: 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43  LV_APP_SKI | CAC
3390: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22  KEY_TLV_APP_PKI"
33a0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a  );...case 0x07:.
33b0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
33c0: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
33d0: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  C | CACKEY_TLV_A
33e0: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f  PP_SKI | CACKEY_
33f0: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
3400: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41  }...return("INVA
3410: 4c 49 44 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66  LID");.}..#  def
3420: 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41  ine malloc(x) CA
3430: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3440: 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63  MALLOC(x, __func
3450: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20  __, __LINE__).# 
3460: 20 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28   define realloc(
3470: 78 2c 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42  x, y) CACKEY_DEB
3480: 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28  UG_FUNC_REALLOC(
3490: 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  x, y, __func__, 
34a0: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64  __LINE__).#  ifd
34b0: 65 66 20 73 74 72 64 75 70 0a 23 20 20 20 20 75  ef strdup.#    u
34c0: 6e 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 65  ndef strdup.#  e
34d0: 6e 64 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73  ndif.#  define s
34e0: 74 72 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f  trdup(x) CACKEY_
34f0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55  DEBUG_FUNC_STRDU
3500: 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f  P(x, __func__, _
3510: 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23  _LINE__).#else.#
3520: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
3530: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e  DEBUG_PRINTF(x..
3540: 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  .) /**/.#  defin
3550: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
3560: 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29  RINTBUF(f, x, y)
3570: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
3580: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 45 52  CACKEY_DEBUG_PER
3590: 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64  ROR(x) /**/.#  d
35a0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
35b0: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
35c0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
35d0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
35e0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
35f0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
3600: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
3610: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
3620: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
3630: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
3640: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
3650: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
3660: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3670: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 78  APPTYPE_TO_STR(x
3680: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
3690: 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63  D".#endif..struc
36a0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
36b0: 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73 69 67 6e  entity {..unsign
36c0: 65 64 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37  ed char applet[7
36d0: 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 66 69 6c  ];..uint16_t fil
36e0: 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65 72 74  e;...size_t cert
36f0: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e  ificate_len;..un
3700: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
3710: 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a  tificate;...ssiz
3720: 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 7d 3b 0a  e_t keysize;.};.
3730: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
3740: 64 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 63  dentity {..struc
3750: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
3760: 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
3770: 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52  ntity;...CK_ATTR
3780: 49 42 55 54 45 20 2a 61 74 74 72 69 62 75 74 65  IBUTE *attribute
3790: 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74  s;..CK_ULONG att
37a0: 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d  ributes_count;.}
37b0: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
37c0: 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20  _session {..int 
37d0: 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f  active;...CK_SLO
37e0: 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43  T_ID slotID;...C
37f0: 4b 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09  K_STATE state;..
3800: 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a  CK_FLAGS flags;.
3810: 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69  .CK_ULONG ulDevi
3820: 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49  ceError;..CK_VOI
3830: 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69  D_PTR pApplicati
3840: 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e  on;..CK_NOTIFY N
3850: 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20  otify;...struct 
3860: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
3870: 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  *identities;..un
3880: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
3890: 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09  tities_count;...
38a0: 69 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69 76  int search_activ
38b0: 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  e;..CK_ATTRIBUTE
38c0: 5f 50 54 52 20 73 65 61 72 63 68 5f 71 75 65 72  _PTR search_quer
38d0: 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61  y;..CK_ULONG sea
38e0: 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b  rch_query_count;
38f0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3900: 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a  search_curr_id;.
3910: 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76  ..int sign_activ
3920: 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  e;..CK_MECHANISM
3930: 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61  _TYPE sign_mecha
3940: 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50  nism;..CK_BYTE_P
3950: 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e  TR sign_buf;..un
3960: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e  signed long sign
3970: 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e  _buflen;..unsign
3980: 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66  ed long sign_buf
3990: 75 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63 61  used;..struct ca
39a0: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 73  ckey_identity *s
39b0: 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09  ign_identity;...
39c0: 69 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74 69  int decrypt_acti
39d0: 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53  ve;..CK_MECHANIS
39e0: 4d 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f 6d  M_TYPE decrypt_m
39f0: 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f  echanism;..CK_VO
3a00: 49 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f 6d  ID_PTR decrypt_m
3a10: 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c  ech_parm;..CK_UL
3a20: 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63 68  ONG decrypt_mech
3a30: 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63  _parmlen;..struc
3a40: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
3a50: 79 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e 74  y *decrypt_ident
3a60: 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ity;.};..struct 
3a70: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69  cackey_slot {..i
3a80: 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 63 68 61  nt active;...cha
3a90: 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a  r *pcsc_reader;.
3aa0: 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f  ..int pcsc_card_
3ab0: 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52  connected;..SCAR
3ac0: 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72  DHANDLE pcsc_car
3ad0: 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63  d;...int transac
3ae0: 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 0a 09 69 6e  tion_depth;...in
3af0: 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09  t slot_reset;...
3b00: 43 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66  CK_FLAGS token_f
3b10: 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64  lags;...unsigned
3b20: 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 7d 3b   char *label;.};
3b30: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
3b40: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
3b50: 5f 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c  _GENERIC = 0x01,
3b60: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
3b70: 5f 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c  _SKI     = 0x02,
3b80: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
3b90: 5f 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a  _PKI     = 0x04.
3ba0: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70  } cackey_tlv_app
3bb0: 74 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65  type;..typedef e
3bc0: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c  num {..CACKEY_TL
3bd0: 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49  V_OBJID_GENERALI
3be0: 4e 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30  NFO       = 0x20
3bf0: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
3c00: 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41  OBJID_PROPERSONA
3c10: 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30  LINFO   = 0x2100
3c20: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
3c30: 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f  JID_ACCESSCONTRO
3c40: 4c 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a  L     = 0x3000,.
3c50: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
3c60: 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20  D_LOGIN         
3c70: 20 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43      = 0x4000,..C
3c80: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3c90: 43 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20  CARDINFO        
3ca0: 20 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43    = 0x5000,..CAC
3cb0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49  KEY_TLV_OBJID_BI
3cc0: 4f 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20  OMETRICS        
3cd0: 3d 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x6000,..CACKE
3ce0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
3cf0: 54 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20  TALSIGCERT    = 
3d00: 30 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x7000,..CACKEY_
3d10: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
3d20: 52 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78  RSON        = 0x
3d30: 30 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0200,..CACKEY_TL
3d40: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45  V_OBJID_CAC_BENE
3d50: 46 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32  FITS      = 0x02
3d60: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
3d70: 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42  OBJID_CAC_OTHERB
3d80: 45 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33  ENEFITS = 0x0203
3d90: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
3da0: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45  JID_CAC_PERSONNE
3db0: 4c 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a  L     = 0x0201,.
3dc0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
3dd0: 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20  D_CAC_PKICERT   
3de0: 20 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63      = 0x02FE.} c
3df0: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
3e00: 69 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  id;..typedef enu
3e10: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  m {..CACKEY_PCSC
3e20: 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20  _S_TOKENPRESENT 
3e30: 20 20 20 3d 20 32 2c 0a 09 43 41 43 4b 45 59 5f     = 2,..CACKEY_
3e40: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_S_TOKENABSE
3e50: 4e 54 20 20 20 20 20 3d 20 31 2c 0a 09 43 41 43  NT     = 1,..CAC
3e60: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
3e70: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a             = 0,.
3e80: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  .CACKEY_PCSC_E_G
3e90: 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d  ENERIC         =
3ea0: 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -1,..CACKEY_PCS
3eb0: 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20  C_E_BADPIN      
3ec0: 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45      = -2,..CACKE
3ed0: 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20  Y_PCSC_E_LOCKED 
3ee0: 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 7d           = -3,.}
3ef0: 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74   cackey_ret;..st
3f00: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
3f10: 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67  cardurl {..unsig
3f20: 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20  ned char        
3f30: 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f  rid[5];..cackey_
3f40: 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 70  tlv_apptype   ap
3f50: 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74  ptype;..cackey_t
3f60: 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a  lv_objectid  obj
3f70: 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74  ectid;..cackey_t
3f80: 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70  lv_objectid  app
3f90: 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  id;..unsigned ch
3fa0: 61 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b  ar        pinid;
3fb0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  .};..struct cack
3fc0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73  ey_tlv_entity;.s
3fd0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
3fe0: 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38  _entity {..uint8
3ff0: 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20  _t tag;..size_t 
4000: 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20  length;...union 
4010: 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b  {...void *value;
4020: 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ...struct cackey
4030: 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61  _tlv_cardurl *va
4040: 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75  lue_cardurl;...u
4050: 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74  int8_t value_byt
4060: 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20  e;..};...struct 
4070: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
4080: 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a  y *_next;.};../*
4090: 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48   CACKEY Global H
40a0: 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63  andles */.static
40b0: 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69   void *cackey_bi
40c0: 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74  glock = NULL;.st
40d0: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
40e0: 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65  ey_session cacke
40f0: 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b  y_sessions[128];
4100: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
4110: 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65  ackey_slot cacke
4120: 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74  y_slots[128];.st
4130: 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
4140: 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
4150: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
4160: 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20  ey_biglock_init 
4170: 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41  = 0;.CK_C_INITIA
4180: 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79  LIZE_ARGS cackey
4190: 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50 43 53 43 20  _args;../* PCSC 
41a0: 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a  Global Handles *
41b0: 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52 44  /.static LPSCARD
41c0: 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f 70  CONTEXT cackey_p
41d0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
41e0: 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  L;..static unsig
41f0: 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f  ned long cackey_
4200: 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  getversion(void)
4210: 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69 67   {..static unsig
4220: 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20  ned long retval 
4230: 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64  = 255;..unsigned
4240: 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b   long major = 0;
4250: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
4260: 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72  minor = 0;..char
4270: 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55   *major_str = NU
4280: 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72  LL;..char *minor
4290: 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43  _str = NULL;...C
42a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
42b0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
42c0: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 32  .if (retval != 2
42d0: 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  55) {...CACKEY_D
42e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
42f0: 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63 61  urning 0x%lx (ca
4300: 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c 29  ched).", retval)
4310: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74 76  ;....return(retv
4320: 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  al);..}...retval
4330: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50 41   = 0;..#ifdef PA
4340: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20  CKAGE_VERSION.  
4350: 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20        major_str 
4360: 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  = PACKAGE_VERSIO
4370: 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74  N;..if (major_st
4380: 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d 61  r) {..        ma
4390: 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61  jor = strtoul(ma
43a0: 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f  jor_str, &minor_
43b0: 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20  str, 10);....if 
43c0: 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09  (minor_str) {...
43d0: 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c  .minor = strtoul
43e0: 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20  (minor_str + 1, 
43f0: 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09  NULL, 10);...}..
4400: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d 61  }...retval = (ma
4410: 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69  jor << 16) | (mi
4420: 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69  nor << 8);.#endi
4430: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
4440: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
4450: 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76 61  ng 0x%lx", retva
4460: 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
4470: 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53  val);.}../* PC/S
4480: 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  C Related Functi
4490: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
44a0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69  POSIS. *     voi
44b0: 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  d cackey_slots_d
44c0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f  isconnect_all(vo
44d0: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  id);. *. * ARGUM
44e0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ENTS. *     None
44f0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
4500: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
4510: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
4520: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
4530: 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f   disconnects fro
4540: 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a 0a  m all cards.. *.
4550: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
4560: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
4570: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64  connect_all(void
4580: 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
4590: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
45a0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
45b0: 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20  .");...for (idx 
45c0: 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
45d0: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
45e0: 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
45f0: 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78  _slots[0])); idx
4600: 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
4610: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
4620: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
4630: 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  d) {....CACKEY_D
4640: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
4650: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75  rdDisconnect(%lu
4660: 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69  ) called", (unsi
4670: 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b  gned long) idx);
4680: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
4690: 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74  nect(cackey_slot
46a0: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
46b0: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
46c0: 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  RD);...}....if (
46d0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
46e0: 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 66 72  ].label) {....fr
46f0: 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
4700: 69 64 78 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09  idx].label);....
4710: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
4720: 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  x].label = NULL;
4730: 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
4740: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
4750: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
4760: 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
4770: 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
4780: 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 0a 09  on_depth = 0;...
4790: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
47a0: 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
47b0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
47c0: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
47d0: 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75   active slot %lu
47e0: 20 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22   as being reset"
47f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
4800: 29 20 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63  ) idx);...}....c
4810: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
4820: 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  .slot_reset = 1;
4830: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
4840: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
4850: 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e  ning");...return
4860: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
4870: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
4880: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73  y_ret cackey_pcs
4890: 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b  c_connect(void);
48a0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
48b0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
48c0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
48d0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
48e0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
48f0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
4900: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
4910: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
4920: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
4930: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
4940: 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f  tion connects to
4950: 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65   the PC/SC Conne
4960: 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e  ction Manager an
4970: 64 20 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a  d updates the. *
4980: 20 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64       global hand
4990: 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  le.. *. */.stati
49a0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
49b0: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
49c0: 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73  (void) {..LONG s
49d0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
49e0: 5f 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56  _ret;.#ifdef HAV
49f0: 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f  E_SCARDISVALIDCO
4a00: 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72  NTEXT..LONG scar
4a10: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23  d_isvalid_ret;.#
4a20: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
4a30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
4a40: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61  led.");...if (ca
4a50: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4a60: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   == NULL) {...ca
4a70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4a80: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
4a90: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
4aa0: 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61  ndle));...if (ca
4ab0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4ac0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43   == NULL) {....C
4ad0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4ae0: 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c  TF("Call to mall
4af0: 6f 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74  oc() failed, ret
4b00: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
4b10: 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  e");.....cackey_
4b20: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
4b30: 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75  _all();.....retu
4b40: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
4b50: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a  _GENERIC);...}..
4b60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4b70: 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61  RINTF("SCardEsta
4b80: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63  blishContext() c
4b90: 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64  alled");...scard
4ba0: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4bb0: 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73   = SCardEstablis
4bc0: 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53  hContext(SCARD_S
4bd0: 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c  COPE_SYSTEM, NUL
4be0: 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f  L, NULL, cackey_
4bf0: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
4c00: 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  if (scard_est_co
4c10: 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41  ntext_ret != SCA
4c20: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
4c30: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4c40: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20  PRINTF("Call to 
4c50: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
4c60: 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65  ntext failed (re
4c70: 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20  turned %s/%li), 
4c80: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
4c90: 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45  lure", CACKEY_DE
4ca0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
4cb0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65  R_TO_STR(scard_e
4cc0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c  st_context_ret),
4cd0: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73   (long) scard_es
4ce0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a  t_context_ret);.
4cf0: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
4d00: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
4d10: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  .cackey_pcsc_han
4d20: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  dle = NULL;.....
4d30: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
4d40: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
4d50: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
4d60: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
4d70: 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66  ;...}..}..#ifdef
4d80: 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c   HAVE_SCARDISVAL
4d90: 49 44 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45  IDCONTEXT..CACKE
4da0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4db0: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74  SCardIsValidCont
4dc0: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
4dd0: 09 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72  .scard_isvalid_r
4de0: 65 74 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69  et = SCardIsVali
4df0: 64 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79  dContext(*cackey
4e00: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
4e10: 69 66 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69  if (scard_isvali
4e20: 64 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  d_ret != SCARD_S
4e30: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41  _SUCCESS) {...CA
4e40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4e50: 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65  F("Handle has be
4e60: 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43  come invalid (SC
4e70: 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78  ardIsValidContex
4e80: 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79  t = %s/%li), try
4e90: 69 6e 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c  ing to re-establ
4ea0: 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f  ish...", CACKEY_
4eb0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
4ec0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
4ed0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28  _isvalid_ret), (
4ee0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61  long) scard_isva
4ef0: 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43  lid_ret);....CAC
4f00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
4f10: 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  ("SCardEstablish
4f20: 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64  Context() called
4f30: 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f  ");...scard_est_
4f40: 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43  context_ret = SC
4f50: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
4f60: 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f  ext(SCARD_SCOPE_
4f70: 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55  SYSTEM, NULL, NU
4f80: 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  LL, cackey_pcsc_
4f90: 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73  handle);...if (s
4fa0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
4fb0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
4fc0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41  SUCCESS) {....CA
4fd0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4fe0: 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64  F("Call to SCard
4ff0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
5000: 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65   failed (returne
5010: 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72  d %s/%li), retur
5020: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
5030: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
5040: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
5050: 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  STR(scard_est_co
5060: 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  ntext_ret), (lon
5070: 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  g) scard_est_con
5080: 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66  text_ret);.....f
5090: 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  ree(cackey_pcsc_
50a0: 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b  handle);....cack
50b0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
50c0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65   NULL;.....cacke
50d0: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
50e0: 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65  ct_all();.....re
50f0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
5100: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
5110: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
5120: 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20  _PRINTF("Handle 
5130: 68 61 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61  has been re-esta
5140: 62 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65  blished");..}.#e
5150: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
5160: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65  BUG_PRINTF("Suce
5170: 73 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65  ssfully connecte
5180: 64 20 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75  d to PC/SC, retu
5190: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
51a0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
51b0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
51c0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
51d0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
51e0: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
51f0: 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29  disconnect(void)
5200: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
5210: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
5220: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
5230: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
5240: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
5250: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
5260: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
5270: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
5280: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
5290: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
52a0: 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74  ction disconnect
52b0: 73 20 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43  s from the PC/SC
52c0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61   Connection mana
52d0: 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a  ger and updates.
52e0: 20 2a 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61   *     the globa
52f0: 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f  l handle.. *. */
5300: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
5310: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  et cackey_pcsc_d
5320: 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20  isconnect(void) 
5330: 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65  {..LONG scard_re
5340: 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a  l_context_ret;..
5350: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5360: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
5370: 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63  ...if (cackey_pc
5380: 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c  sc_handle == NUL
5390: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41  L) {...return(CA
53a0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
53b0: 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f  ..}...scard_rel_
53c0: 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43  context_ret = SC
53d0: 61 72 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78  ardReleaseContex
53e0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
53f0: 61 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61  andle);...if (ca
5400: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
5410: 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
5420: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
5430: 09 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
5440: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09  handle = NULL;..
5450: 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65  }...if (scard_re
5460: 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d  l_context_ret !=
5470: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
5480: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ) {...return(CAC
5490: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
54a0: 49 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  IC);..}...return
54b0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
54c0: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
54d0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
54e0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
54f0: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
5500: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
5510: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
5520: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
5530: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
5540: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
5550: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
5560: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
5570: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
5580: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
5590: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
55a0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
55b0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
55c0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
55d0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
55e0: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
55f0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5600: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
5610: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5620: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
5630: 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e  key_ret pcsc_con
5640: 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44  nect_ret;..DWORD
5650: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47   protocol;..LONG
5660: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
5670: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5680: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
5690: 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20  );...if (!slot) 
56a0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
56b0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
56c0: 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2c   slot specified,
56d0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
56e0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
56f0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
5700: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
5710: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
5720: 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63   = cackey_pcsc_c
5730: 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70  onnect();..if (p
5740: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
5750: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
5760: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
5770: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
5780: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53  nnection to PC/S
5790: 43 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  C failed, return
57a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
57b0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
57c0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
57d0: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e  C);..}.../* Conn
57e0: 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20 69  ect to reader, i
57f0: 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66 20  f needed */..if 
5800: 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  (!slot->pcsc_car
5810: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
5820: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5830: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
5840: 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c 20  ct(%s) called", 
5850: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
5860: 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e  r);...scard_conn
5870: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
5880: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
5890: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
58a0: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
58b0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
58c0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
58d0: 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  0, &slot->pcsc_c
58e0: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
58f0: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
5900: 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  nn_ret != SCARD_
5910: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
5920: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5930: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
5940: 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c 20  to card failed, 
5950: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
5960: 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e 65  lure (SCardConne
5970: 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c  ct() = %s/%li)",
5980: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
5990: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
59a0: 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  TR(scard_conn_re
59b0: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
59c0: 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09  _conn_ret);.....
59d0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
59e0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
59f0: 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63  .}....slot->pcsc
5a00: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
5a10: 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 1;...slot->tra
5a20: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
5a30: 20 30 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28   0;..}...return(
5a40: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
5a50: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
5a60: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
5a70: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
5a80: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
5a90: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5aa0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
5ab0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
5ac0: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
5ad0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
5ae0: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
5af0: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
5b00: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
5b10: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
5b20: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
5b30: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
5b40: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5b50: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
5b60: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
5b70: 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f    The transactio
5b80: 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65 72 6d  n should be term
5b90: 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22 63 61  inated using "ca
5ba0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
5bb0: 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  tion". *. */.sta
5bc0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
5bd0: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
5be0: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
5bf0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
5c00: 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ) {..cackey_ret 
5c10: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b  cackey_conn_ret;
5c20: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61  ..LONG scard_tra
5c30: 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ns_ret;...CACKEY
5c40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
5c50: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61 63 6b  alled.");...cack
5c60: 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  ey_conn_ret = ca
5c70: 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
5c80: 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 63 61  d(slot);..if (ca
5c90: 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d  ckey_conn_ret !=
5ca0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
5cb0: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
5cc0: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
5cd0: 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
5ce0: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
5cf0: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
5d00: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5d10: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
5d20: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  }...slot->transa
5d30: 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a  ction_depth++;..
5d40: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
5d50: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 31  action_depth > 1
5d60: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
5d70: 55 47 5f 50 52 49 4e 54 46 28 22 41 6c 72 65 61  UG_PRINTF("Alrea
5d80: 64 79 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74  dy in a transact
5d90: 69 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20  ion, performing 
5da0: 6e 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77 20 64  no action (new d
5db0: 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f  epth = %i)", slo
5dc0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
5dd0: 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e  epth);....return
5de0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
5df0: 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74  K);..}...scard_t
5e00: 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64  rans_ret = SCard
5e10: 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
5e20: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
5e30: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72  );..if (scard_tr
5e40: 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ans_ret != SCARD
5e50: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
5e60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5e70: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62  NTF("Unable to b
5e80: 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
5e90: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
5ea0: 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  rror");....retur
5eb0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
5ec0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
5ed0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5ee0: 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20  TF("Sucessfully 
5ef0: 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f  began transactio
5f00: 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c  n on slot (%s)",
5f10: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
5f20: 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  er);...return(CA
5f30: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
5f40: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
5f50: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
5f60: 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f  _ret cackey_end_
5f70: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
5f80: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
5f90: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
5fa0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
5fb0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
5fc0: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
5fd0: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
5fe0: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
5ff0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
6000: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
6010: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
6020: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
6030: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
6040: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
6050: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
6060: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75  is function requ
6070: 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67  ires "cackey_beg
6080: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20  in_transaction" 
6090: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  to be called fir
60a0: 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  st. *. */.static
60b0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
60c0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
60d0: 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  on(struct cackey
60e0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
60f0: 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73  LONG scard_trans
6100: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
6110: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6120: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
6130: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
6140: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41  onnected) {...CA
6150: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6160: 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63  F("Card is not c
6170: 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65  onnected, unable
6180: 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74   to end transact
6190: 69 6f 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ion");....return
61a0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
61b0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66  ENERIC);..}...if
61c0: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
61d0: 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30 29 20  ion_depth == 0) 
61e0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
61f0: 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69 6e 61  _PRINTF("Termina
6200: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
6210: 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
6220: 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72 65 74  begun!");....ret
6230: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6240: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
6250: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
6260: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 66  on_depth--;...if
6270: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
6280: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
6290: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
62a0: 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61 63 74  PRINTF("Transact
62b0: 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20 70 72  ions still in pr
62c0: 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65 72 6d  ogress, not term
62d0: 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72 64 20  inating on-card 
62e0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72  Transaction (cur
62f0: 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29  rent depth = %i)
6300: 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ", slot->transac
6310: 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09  tion_depth);....
6320: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
6330: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
6340: 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f  }...scard_trans_
6350: 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72  ret = SCardEndTr
6360: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
6370: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
6380: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69  _LEAVE_CARD);..i
6390: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  f (scard_trans_r
63a0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
63b0: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
63c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
63d0: 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72  Unable to end tr
63e0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
63f0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
6400: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
6410: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
6420: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
6430: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
6440: 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61  essfully termina
6450: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
6460: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
6470: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
6480: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
6490: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
64a0: 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65  ../* APDU Relate
64b0: 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f  d Functions */./
64c0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
64d0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
64e0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
64f0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
6500: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
6510: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
6520: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
6530: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
6540: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
6550: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
6560: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c  nsigned char lc,
6570: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6580: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63  data, unsigned c
6590: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74  har le, uint16_t
65a0: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69   *respcode, unsi
65b0: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
65c0: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73  ata, size_t *res
65d0: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  pdata_len);. *. 
65e0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
65f0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
6600: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
6610: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
6620: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
6630: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
6640: 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20   class. *       
6650: 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53    APDU Class (GS
6660: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
6670: 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53  6 or GSCIS_CLASS
6680: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
6690: 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61  . *         usua
66a0: 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20  lly), (CLA). *. 
66b0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
66c0: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  har instruction.
66d0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
66e0: 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53  Instruction (INS
66f0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
6700: 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20  gned char p1. * 
6710: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
6720: 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a  ameter 1 (P1). *
6730: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
6740: 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20   char p2. *     
6750: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74      APDU Paramet
6760: 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20  er 2 (P2). *. * 
6770: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
6780: 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20  r lc. *         
6790: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43  APDU Length of C
67a0: 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74  ontent (Lc) -- t
67b0: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
67c0: 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20  h of "data". *  
67d0: 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72         parameter
67e0: 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20  .  If "data" is 
67f0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
6800: 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  L, this paramete
6810: 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20  r will. *       
6820: 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a    be ignored.. *
6830: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
6840: 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20   char *data. *  
6850: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
6860: 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64  o buffer to send
6870: 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  .  It should be 
6880: 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e  "Lc" bytes long.
6890: 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20    If. *         
68a0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
68b0: 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74  L, "Lc" will not
68c0: 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68   be sent, and th
68d0: 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62  is buffer will b
68e0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e  e. *         ign
68f0: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
6900: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
6910: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
6920: 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63   Length of Expec
6930: 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74  tation (Le) -- t
6940: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
6950: 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20  h of the. *     
6960: 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70      expected rep
6970: 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ly.  If this is 
6980: 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74  specified as 0 t
6990: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a  hen it will not.
69a0: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65   *         be se
69b0: 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69  nt.. *. *     ui
69c0: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
69d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
69e0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
69f0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
6a00: 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20  ponse code.  If 
6a10: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
6a20: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
6a30: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
6a40: 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  se code will be 
6a50: 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a  discarded.. *. *
6a60: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
6a70: 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20  ar *respdata. * 
6a80: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f          [OUT] Po
6a90: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65  inter to storage
6aa0: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73   of APDU respons
6ab0: 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73  e data.  If this
6ac0: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73   is. *         s
6ad0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
6ae0: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64  , the response d
6af0: 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63  ata will be disc
6b00: 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20  arded.  If. *   
6b10: 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64        the "respd
6b20: 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74  ata_len" paramet
6b30: 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20  er is specified 
6b40: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75  as NULL, this bu
6b50: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
6b60: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
6b70: 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73  ted.. *. *     s
6b80: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
6b90: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  len. *         [
6ba0: 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72  IN, OUT] Pointer
6bb0: 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74   initialing cont
6bc0: 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20  aining the size 
6bd0: 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61  of the "respdata
6be0: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66  ". *         buf
6bf0: 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74  fer.  Before ret
6c00: 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e  urning, the poin
6c10: 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20  ted to value is 
6c20: 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20  updated to the. 
6c30: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
6c40: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
6c50: 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  n to the buffer.
6c60: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65    If this is spe
6c70: 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20  cified as. *    
6c80: 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69       NULL, it wi
6c90: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
6ca0: 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61  d, and "respdata
6cb0: 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  " will be ignore
6cc0: 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20  d causing. *    
6cd0: 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73       the respons
6ce0: 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73  e data to be dis
6cf0: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45  carded.. *. * RE
6d00: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6d10: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
6d20: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
6d30: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
6d40: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6d50: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
6d60: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
6d70: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
6d80: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
6d90: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
6da0: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61  tion Manager via
6db0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70  . *     cackey_p
6dc0: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66  csc_connect() if
6dd0: 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20   needed.. *. *  
6de0: 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65     It will conne
6df0: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69  ct to the card i
6e00: 6e 20 74 68 65 20 72 65 61 64 65 72 20 61 74 74  n the reader att
6e10: 61 63 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f  ached to the slo
6e20: 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69 66 69  t. *     specifi
6e30: 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63  ed.  It will rec
6e40: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61  onnect to the ca
6e50: 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  rd if the connec
6e60: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73  tion. *     goes
6e70: 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74   away.. *. */.st
6e80: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
6e90: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
6ea0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
6eb0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
6ec0: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
6ed0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
6ee0: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
6ef0: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
6f00: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
6f10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c  nsigned char lc,
6f20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6f30: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63  data, unsigned c
6f40: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74  har le, uint16_t
6f50: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69   *respcode, unsi
6f60: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
6f70: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73  ata, size_t *res
6f80: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69  pdata_len) {..ui
6f90: 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20  nt8_t major_rc, 
6fa0: 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f  minor_rc;..size_
6fb0: 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c  t bytes_to_copy,
6fc0: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65   tmp_respdata_le
6fd0: 6e 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  n;..DWORD protoc
6fe0: 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f  ol;..DWORD xmit_
6ff0: 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09  len, recv_len;..
7000: 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f  LONG scard_xmit_
7010: 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
7020: 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69  n_ret;..BYTE xmi
7030: 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63  t_buf[1024], rec
7040: 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e  v_buf[1024];..in
7050: 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
7060: 65 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70  et, pcsc_getresp
7070: 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  _ret;..int idx;.
7080: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7090: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
70a0: 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b  ;...if (!slot) {
70b0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
70c0: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
70d0: 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22  slot specified."
70e0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
70f0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7100: 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63  IC);..}...pcsc_c
7110: 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
7120: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
7130: 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73  (slot);..if (pcs
7140: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
7150: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
7160: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
7170: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
7180: 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
7190: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
71a0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
71b0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
71c0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
71d0: 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69  ..}.../* Transmi
71e0: 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d  t */..xmit_len =
71f0: 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d   0;..xmit_buf[xm
7200: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73  it_len++] = clas
7210: 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  s;..xmit_buf[xmi
7220: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72  t_len++] = instr
7230: 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75  uction;..xmit_bu
7240: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
7250: 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  p1;..xmit_buf[xm
7260: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a  it_len++] = p2;.
7270: 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09 78  .if (data) {...x
7280: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
7290: 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 66 6f 72 20  ++] = lc;...for 
72a0: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
72b0: 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09  lc; idx++) {....
72c0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
72d0: 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d  n++] = data[idx]
72e0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c  ;...}..}...if (l
72f0: 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 78  e != 0x00) {...x
7300: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
7310: 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d 0a 0a 09 2f  ++] = le;..}.../
7320: 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72  * Begin Smartcar
7330: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
7340: 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  ..cackey_begin_t
7350: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
7360: 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d 3d  ;...if (class ==
7370: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
7380: 37 38 31 36 20 26 26 20 69 6e 73 74 72 75 63 74  7816 && instruct
7390: 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e 53  ion == GSCIS_INS
73a0: 54 52 5f 56 45 52 49 46 59 20 26 26 20 70 31 20  TR_VERIFY && p1 
73b0: 3d 3d 20 30 78 30 30 20 26 26 20 70 32 20 3d 3d  == 0x00 && p2 ==
73c0: 20 30 78 30 30 29 20 7b 0a 09 09 43 41 43 4b 45   0x00) {...CACKE
73d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
73e0: 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 20 3c 3c  Sending APDU: <<
73f0: 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a 09 7d  censored>>");..}
7400: 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59   else {...CACKEY
7410: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
7420: 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 22 2c  "Sending APDU:",
7430: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
7440: 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63 76 5f  len);..}...recv_
7450: 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63  len = sizeof(rec
7460: 76 5f 62 75 66 29 3b 0a 09 73 63 61 72 64 5f 78  v_buf);..scard_x
7470: 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54  mit_ret = SCardT
7480: 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63  ransmit(slot->pc
7490: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 50  sc_card, SCARD_P
74a0: 43 49 5f 54 30 2c 20 78 6d 69 74 5f 62 75 66 2c  CI_T0, xmit_buf,
74b0: 20 78 6d 69 74 5f 6c 65 6e 2c 20 53 43 41 52 44   xmit_len, SCARD
74c0: 5f 50 43 49 5f 54 31 2c 20 72 65 63 76 5f 62 75  _PCI_T1, recv_bu
74d0: 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 09  f, &recv_len);..
74e0: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
74f0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
7500: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
7510: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7520: 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41  Failed to send A
7530: 50 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61  PDU to card (SCa
7540: 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25  rdTransmit() = %
7550: 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f  s/%lx)", CACKEY_
7560: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
7570: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
7580: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73  _xmit_ret), (uns
7590: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72  igned long) scar
75a0: 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 09 09 43  d_xmit_ret);...C
75b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
75c0: 54 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74  TF("Marking slot
75d0: 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20   as having been 
75e0: 72 65 73 65 74 22 29 3b 0a 0a 09 09 73 6c 6f 74  reset");....slot
75f0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
7600: 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d  pth = 0;...slot-
7610: 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  >slot_reset = 1;
7620: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d  ....if (scard_xm
7630: 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  it_ret == SCARD_
7640: 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a  W_RESET_CARD) {.
7650: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7660: 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65  PRINTF("Reset re
7670: 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68  quired, please h
7680: 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63  old...");.....sc
7690: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
76a0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
76b0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
76c0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
76d0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
76e0: 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45  COL_T0, SCARD_RE
76f0: 53 45 54 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f  SET_CARD, &proto
7700: 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61  col);....if (sca
7710: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d  rd_reconn_ret ==
7720: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
7730: 29 20 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73  ) {...../* Re-es
7740: 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74  tablish transact
7750: 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70  ion, if it was p
7760: 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66  resent */.....if
7770: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
7780: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
7790: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
77a0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
77b0: 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67  ......cackey_beg
77c0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
77d0: 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lot);.....}.....
77e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
77f0: 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63  INTF("Reset succ
7800: 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d  essful, retransm
7810: 69 74 74 69 6e 67 22 29 3b 0a 09 09 09 09 73 63  itting");.....sc
7820: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
7830: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
7840: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
7850: 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74  ARD_PCI_T0, xmit
7860: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
7870: 53 43 41 52 44 5f 50 43 49 5f 54 30 2c 20 72 65  SCARD_PCI_T0, re
7880: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65  cv_buf, &recv_le
7890: 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61  n);......if (sca
78a0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
78b0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
78c0: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
78d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72  BUG_PRINTF("Retr
78e0: 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72  ansmit failed, r
78f0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
7900: 75 72 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e  ure after discon
7910: 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61 72 64  necting the card
7920: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20   (SCardTransmit 
7930: 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b  = %s/%li)", CACK
7940: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
7950: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
7960: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28  ard_xmit_ret), (
7970: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74  long) scard_xmit
7980: 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61  _ret);.......SCa
7990: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
79a0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
79b0: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 29 3b  ARD_RESET_CARD);
79c0: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  ......slot->pcsc
79d0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
79e0: 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e  = 0;......./* En
79f0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
7a00: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09  saction */......
7a10: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7a20: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
7a30: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
7a40: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
7a50: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
7a60: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7a70: 49 43 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  IC);.....}....} 
7a80: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
7a90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7aa0: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61  Disconnecting ca
7ab0: 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64  rd");......SCard
7ac0: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
7ad0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
7ae0: 44 5f 52 45 53 45 54 5f 43 41 52 44 29 3b 0a 09  D_RESET_CARD);..
7af0: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
7b00: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
7b10: 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d  ;....../* End Sm
7b20: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
7b30: 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d  ion */.....slot-
7b40: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
7b50: 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b  th = 1;.....cack
7b60: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
7b70: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43  on(slot);......C
7b80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7b90: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
7ba0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09   failure");.....
7bb0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7bc0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7bd0: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
7be0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7bf0: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63  RINTF("Disconnec
7c00: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09  ting card");....
7c10: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
7c20: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7c30: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
7c40: 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63  RD);....slot->pc
7c50: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
7c60: 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e  d = 0;...../* En
7c70: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
7c80: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c  saction */....sl
7c90: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
7ca0: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61  depth = 1;....ca
7cb0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
7cc0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
7cd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7ce0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
7cf0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
7d00: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7d10: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7d20: 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
7d30: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52  EBUG_PRINTBUF("R
7d40: 65 74 75 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c  eturned Value:",
7d50: 20 72 65 63 76 5f 62 75 66 2c 20 72 65 63 76 5f   recv_buf, recv_
7d60: 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65 63 76  len);...if (recv
7d70: 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a  _len < 2) {.../*
7d80: 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73   Minimal respons
7d90: 65 20 6c 65 6e 67 74 68 20 69 73 20 32 20 62 79  e length is 2 by
7da0: 74 65 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  tes, returning i
7db0: 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43  n failure */...C
7dc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7dd0: 54 46 28 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f  TF("Response too
7de0: 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e   small, returnin
7df0: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 72 65  g in failure (re
7e00: 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20  cv_len = %lu)", 
7e10: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
7e20: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a  recv_len);..../*
7e30: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
7e40: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
7e50: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
7e60: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
7e70: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7e80: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
7e90: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
7ea0: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  e result code */
7eb0: 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63  ..major_rc = rec
7ec0: 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d  v_buf[recv_len -
7ed0: 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d   2];..minor_rc =
7ee0: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c   recv_buf[recv_l
7ef0: 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65  en - 1];..if (re
7f00: 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73  spcode) {...*res
7f10: 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72  pcode = (major_r
7f20: 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f  c << 8) | minor_
7f30: 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75  rc;..}.../* Adju
7f40: 73 74 20 6d 65 73 73 61 67 65 20 62 75 66 66 65  st message buffe
7f50: 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d  r */..recv_len -
7f60: 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79  = 2;.../* Add by
7f70: 74 65 73 20 74 6f 20 72 65 74 75 72 6e 20 76 61  tes to return va
7f80: 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70  lue */..tmp_resp
7f90: 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69  data_len = 0;..i
7fa0: 66 20 28 72 65 73 70 64 61 74 61 20 26 26 20 72  f (respdata && r
7fb0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
7fc0: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
7fd0: 6e 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  n = *respdata_le
7fe0: 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63  n;....bytes_to_c
7ff0: 6f 70 79 20 3d 20 2a 72 65 73 70 64 61 74 61 5f  opy = *respdata_
8000: 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63 76  len;....if (recv
8010: 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f  _len < bytes_to_
8020: 63 6f 70 79 29 20 7b 0a 09 09 09 62 79 74 65 73  copy) {....bytes
8030: 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f  _to_copy = recv_
8040: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  len;...}....CACK
8050: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8060: 22 43 6f 70 79 69 6e 67 20 25 6c 75 20 62 79 74  "Copying %lu byt
8070: 65 73 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  es to the buffer
8080: 20 28 72 65 63 76 27 64 20 25 6c 75 20 62 79 74   (recv'd %lu byt
8090: 65 73 2c 20 62 75 74 20 6f 6e 6c 79 20 25 6c 75  es, but only %lu
80a0: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 6f   bytes left in o
80b0: 75 72 20 62 75 66 66 65 72 29 22 2c 20 28 75 6e  ur buffer)", (un
80c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74  signed long) byt
80d0: 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 28 75 6e 73  es_to_copy, (uns
80e0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76  igned long) recv
80f0: 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20  _len, (unsigned 
8100: 6c 6f 6e 67 29 20 2a 72 65 73 70 64 61 74 61 5f  long) *respdata_
8110: 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28  len);....memcpy(
8120: 72 65 73 70 64 61 74 61 2c 20 72 65 63 76 5f 62  respdata, recv_b
8130: 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  uf, bytes_to_cop
8140: 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61 20 2b  y);...respdata +
8150: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
8160: 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65  ....*respdata_le
8170: 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  n = bytes_to_cop
8180: 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74  y;...tmp_respdat
8190: 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74  a_len -= bytes_t
81a0: 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20  o_copy;..} else 
81b0: 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e  {...if (recv_len
81c0: 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
81d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
81e0: 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79 20 25  "Throwing away %
81f0: 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68 65 72  lu bytes, nowher
8200: 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21 22 2c  e to put them!",
8210: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
8220: 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a   recv_len);...}.
8230: 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72  .}...if (major_r
8240: 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f  c == 0x61) {.../
8250: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52 45 41  * We need to REA
8260: 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  D */...CACKEY_DE
8270: 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66  BUG_PRINTF("Buff
8280: 65 72 20 72 65 61 64 20 72 65 71 75 69 72 65 64  er read required
8290: 22 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72  ");....if (minor
82a0: 5f 72 63 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09  _rc == 0x00) {..
82b0: 09 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 32 35 33  ..minor_rc = 253
82c0: 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65  ;...}....pcsc_ge
82d0: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b  tresp_ret = cack
82e0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
82f0: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
8300: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
8310: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45  STR_GET_RESPONSE
8320: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c  , 0x00, 0x00, 0,
8330: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c   NULL, minor_rc,
8340: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64   respcode, respd
8350: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61  ata, &tmp_respda
8360: 74 61 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 70  ta_len);...if (p
8370: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
8380: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
8390: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
83a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
83b0: 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65  uffer read faile
83c0: 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e  d!  Returning in
83d0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
83e0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
83f0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
8400: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
8410: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
8420: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
8430: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8440: 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72  C);...}....if (r
8450: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
8460: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  ..*respdata_len 
8470: 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  += tmp_respdata_
8480: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45  len;...}..../* E
8490: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
84a0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61  nsaction */...ca
84b0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
84c0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43  tion(slot);....C
84d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
84e0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
84f0: 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72   success (buffer
8500: 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22   read complete)"
8510: 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8520: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
8530: 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  }.../* End Smart
8540: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
8550: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
8560: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
8570: 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72  );...if (major_r
8580: 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f  c == 0x90) {.../
8590: 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43  * Success */...C
85a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
85b0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
85c0: 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f   success (major_
85d0: 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09  rc = 0x90)");...
85e0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
85f0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a  CSC_S_OK);..}...
8600: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8610: 49 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72  INTF("APDU Retur
8620: 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65  ned an error, re
8630: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
8640: 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  re");...return(C
8650: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8660: 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  ERIC);.}../*. * 
8670: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
8680: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72  ssize_t cackey_r
8690: 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63  ead_buffer(struc
86a0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
86b0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
86c0: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
86d0: 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e  _t count, unsign
86e0: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20  ed char t_or_v, 
86f0: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
8700: 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  ffset);. *. * AR
8710: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
8720: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8730: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
8740: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
8750: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
8760: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
8770: 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20  har *buffer. *  
8780: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66         [OUT] Buf
8790: 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  fer. *. *     si
87a0: 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20  ze_t count. *   
87b0: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
87c0: 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74  bytes to attempt
87d0: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20   to read. *. *  
87e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
87f0: 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20   t_or_v. *      
8800: 20 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d     Select the T-
8810: 62 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56  buffer (01) or V
8820: 2d 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20  -buffer (02) to 
8830: 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a  read from.  . *.
8840: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e   *     size_t in
8850: 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20  itial_offset. * 
8860: 20 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20          Specify 
8870: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  the offset to be
8880: 67 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f  gin the read fro
8890: 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  m. *. *. * RETUR
88a0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
88b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
88c0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
88d0: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
88e0: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
88f0: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
8900: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
8910: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
8920: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61  ize_t cackey_rea
8930: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20  d_buffer(struct 
8940: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8950: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
8960: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
8970: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64   count, unsigned
8980: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69   char t_or_v, si
8990: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
89a0: 73 65 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 6f  set) {..size_t o
89b0: 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f  ffset = 0, max_o
89c0: 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74  ffset, max_count
89d0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
89e0: 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36   cmd[2];..uint16
89f0: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e  _t respcode;..in
8a00: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
8a10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8a20: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
8a30: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75  max_offset = cou
8a40: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  nt;..max_count =
8a50: 20 32 35 32 3b 0a 0a 09 69 66 20 28 74 5f 6f 72   252;...if (t_or
8a60: 5f 76 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f  _v != 1 && t_or_
8a70: 76 20 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b  v != 2) {...CACK
8a80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8a90: 22 49 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20  "Invalid T or V 
8aa0: 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
8ab0: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
8ac0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
8ad0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
8ae0: 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76  .cmd[0] = t_or_v
8af0: 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ;...while (1) {.
8b00: 09 09 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20  ..if (offset >= 
8b10: 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09  max_offset) {...
8b20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8b30: 49 4e 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f  INTF("Buffer too
8b40: 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e   small, returnin
8b50: 67 20 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e  g what we got...
8b60: 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ");.....break;..
8b70: 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61  .}....count = ma
8b80: 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65  x_offset - offse
8b90: 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e  t;...if (count >
8ba0: 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09   max_count) {...
8bb0: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  .count = max_cou
8bc0: 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31  nt;...}....cmd[1
8bd0: 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65  ] = count;....se
8be0: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
8bf0: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
8c00: 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42  GSCIS_CLASS_GLOB
8c10: 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43  AL_PLATFORM, GSC
8c20: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
8c30: 46 46 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f  FFER, ((initial_
8c40: 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29  offset + offset)
8c50: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28   >> 8) & 0xff, (
8c60: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b  initial_offset +
8c70: 20 6f 66 66 73 65 74 29 20 26 20 30 78 66 66 2c   offset) & 0xff,
8c80: 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d   sizeof(cmd), cm
8c90: 64 2c 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f  d, 0x00, &respco
8ca0: 64 65 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66  de, buffer + off
8cb0: 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 09 09  set, &count);...
8cc0: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
8cd0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8ce0: 29 20 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63  ) {....if (respc
8cf0: 6f 64 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b  ode == 0x6A86) {
8d00: 0a 09 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75  .....if (max_cou
8d10: 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09  nt == 1) {......
8d20: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
8d30: 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61  ..max_count = ma
8d40: 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09  x_count / 2;....
8d50: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
8d60: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
8d70: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
8d80: 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69  _send_apdu() fai
8d90: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
8da0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
8db0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
8dc0: 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f  ....offset += co
8dd0: 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e  unt;....if (coun
8de0: 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b  t < max_count) {
8df0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8e00: 5f 50 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72  _PRINTF("Short r
8e10: 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25  ead -- count = %
8e20: 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c  i, cmd[1] = %i",
8e30: 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69   (int) count, (i
8e40: 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09  nt) cmd[1]);....
8e50: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
8e60: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
8e70: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
8e80: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
8e90: 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f  ..if (offset > _
8ea0: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29  POSIX_SSIZE_MAX)
8eb0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
8ec0: 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74  G_PRINTF("Offset
8ed0: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
8ee0: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
8ef0: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
8f00: 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74  ax = %li, offset
8f10: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
8f20: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
8f30: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
8f40: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72  g) offset);....r
8f50: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
8f60: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
8f70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8f80: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
8f90: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20  n success, read 
8fa0: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73  %lu bytes", (uns
8fb0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73  igned long) offs
8fc0: 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66  et);...return(of
8fd0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  fset);.}../*. * 
8fe0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
8ff0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
9000: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
9010: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
9020: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
9030: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
9040: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20  ze_t aid_len);. 
9050: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
9060: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
9070: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
9080: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
9090: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
90a0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
90b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a  igned char *aid.
90c0: 20 2a 20 20 20 20 20 20 20 20 20 42 75 66 66 65   *         Buffe
90d0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70  r containing App
90e0: 6c 65 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74  let ID to select
90f0: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
9100: 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20  t aid_len. *    
9110: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62       Number of b
9120: 79 74 65 73 20 69 6e 20 74 68 65 20 22 61 69 64  ytes in the "aid
9130: 22 20 28 41 70 70 6c 65 74 20 49 44 29 20 70 61  " (Applet ID) pa
9140: 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45  rameter. *. * RE
9150: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
9160: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
9170: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
9180: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
9190: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
91a0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
91b0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
91c0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
91d0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
91e0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
91f0: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  plet(struct cack
9200: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
9210: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
9220: 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65  d, size_t aid_le
9230: 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  n) {..int send_r
9240: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
9250: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
9260: 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
9270: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53  EBUG_PRINTBUF("S
9280: 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a  electing applet:
9290: 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29  ", aid, aid_len)
92a0: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
92b0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
92c0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
92d0: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
92e0: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47  _INSTR_SELECT, G
92f0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
9300: 54 5f 41 50 50 4c 45 54 2c 20 30 78 30 43 2c 20  T_APPLET, 0x0C, 
9310: 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78  aid_len, aid, 0x
9320: 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  00, NULL, NULL, 
9330: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64  NULL);..if (send
9340: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
9350: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
9360: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9370: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  F("Failed to ope
9380: 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e  n applet, return
9390: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
93a0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
93b0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
93c0: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
93d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
93e0: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
93f0: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
9400: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
9410: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
9420: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
9430: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
9440: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
9450: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
9460: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
9470: 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  t ef);. *. * ARG
9480: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
9490: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
94a0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
94b0: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
94c0: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
94d0: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66       uint16_t ef
94e0: 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d  . *         Elem
94f0: 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65  ental File to se
9500: 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52  lect. *. * RETUR
9510: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
9520: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
9530: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
9540: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
9550: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
9560: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
9570: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
9580: 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45  his selects an E
9590: 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28  lementary File (
95a0: 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75  EF) under the cu
95b0: 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64  rrently selected
95c0: 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65  . *     Dedicate
95d0: 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20  d File (DF). *. 
95e0: 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20  *     Typically 
95f0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  this is called a
9600: 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74  fter selecting t
9610: 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65  he correct Apple
9620: 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20  t (using. *     
9630: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
9640: 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72  plet) for VM car
9650: 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ds. *. */.static
9660: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
9670: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
9680: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
9690: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
96a0: 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65  t ef) {..unsigne
96b0: 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32  d char fid_buf[2
96c0: 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  ];..int send_ret
96d0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
96e0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
96f0: 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68  ");.../* Open th
9700: 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c  e elementary fil
9710: 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d  e */..fid_buf[0]
9720: 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30   = (ef >> 8) & 0
9730: 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d  xff;..fid_buf[1]
9740: 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09   = ef & 0xff;...
9750: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9760: 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66  NTF("Selecting f
9770: 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e  ile: %04lx", (un
9780: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29  signed long) ef)
9790: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
97a0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
97b0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
97c0: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
97d0: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30  _INSTR_SELECT, 0
97e0: 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f  x02, 0x0C, sizeo
97f0: 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f  f(fid_buf), fid_
9800: 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  buf, 0x00, NULL,
9810: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69   NULL, NULL);..i
9820: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
9830: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
9840: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
9850: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
9860: 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72   to open file, r
9870: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
9880: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
9890: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
98a0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
98b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
98c0: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
98d0: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b  selected file");
98e0: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
98f0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
9900: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
9910: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
9920: 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63  y_free_tlv(struc
9930: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
9940: 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20  ity *root);. *. 
9950: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
9960: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
9970: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f  _tlv_entity *roo
9980: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f  t. *         Roo
9990: 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73  t of the TLV lis
99a0: 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69  t to start freei
99b0: 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ng. *. * RETURN 
99c0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
99d0: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
99e0: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
99f0: 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56  on frees the TLV
9a00: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72   linked listed r
9a10: 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20  eturned from. * 
9a20: 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64      "cackey_read
9a30: 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  _tlv". *. */.sta
9a40: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
9a50: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
9a60: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
9a70: 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75  y *root) {..stru
9a80: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
9a90: 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78  tity *curr, *nex
9aa0: 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d  t;...if (root ==
9ab0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
9ac0: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72  n;..}...for (cur
9ad0: 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20  r = root; curr; 
9ae0: 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09  curr = next) {..
9af0: 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e  .next = curr->_n
9b00: 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ext;....switch (
9b10: 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09  curr->tag) {....
9b20: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
9b30: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73  CR_TABLE:....cas
9b40: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
9b50: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20  IFICATE:.....if 
9b60: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a  (curr->value) {.
9b70: 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e  .....free(curr->
9b80: 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09  value);.....}...
9b90: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
9ba0: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
9bb0: 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  RL:.....if (curr
9bc0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
9bd0: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
9be0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
9bf0: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
9c00: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28  ak;...}....free(
9c10: 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  curr);..}...retu
9c20: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
9c30: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
9c40: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
9c50: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
9c60: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
9c70: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
9c80: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
9c90: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
9ca0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
9cb0: 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  _entity *cackey_
9cc0: 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20  read_tlv(struct 
9cd0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
9ce0: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
9cf0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
9d00: 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f  curr_entity, *ro
9d10: 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74  ot = NULL, *last
9d20: 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e   = NULL;..unsign
9d30: 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66  ed char tlen_buf
9d40: 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30  [2], tval_buf[10
9d50: 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73  24], *tval;..uns
9d60: 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f  igned char vlen_
9d70: 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66  buf[2], vval_buf
9d80: 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09  [8192], *vval;..
9d90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
9da0: 6d 70 62 75 66 3b 0a 09 73 73 69 7a 65 5f 74 20  mpbuf;..ssize_t 
9db0: 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69  tlen, vlen;..ssi
9dc0: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09  ze_t read_ret;..
9dd0: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20  size_t offset_t 
9de0: 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20  = 0, offset_v = 
9df0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  0;..unsigned cha
9e00: 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  r tag;..size_t l
9e10: 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41  ength;.#ifdef HA
9e20: 56 45 5f 4c 49 42 5a 0a 09 75 4c 6f 6e 67 66 20  VE_LIBZ..uLongf 
9e30: 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20  tmpbuflen;..int 
9e40: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a  uncompress_ret;.
9e50: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
9e60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
9e70: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f  lled.");...read_
9e80: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
9e90: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74  d_buffer(slot, t
9ea0: 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  len_buf, sizeof(
9eb0: 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66  tlen_buf), 1, of
9ec0: 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65  fset_t);..if (re
9ed0: 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66  ad_ret != sizeof
9ee0: 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09  (tlen_buf)) {...
9ef0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9f00: 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64  NTF("Read failed
9f10: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
9f20: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9f30: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
9f40: 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66  tlen = (tlen_buf
9f50: 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e  [1] << 8) | tlen
9f60: 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f  _buf[0];...read_
9f70: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
9f80: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76  d_buffer(slot, v
9f90: 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  len_buf, sizeof(
9fa0: 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66  vlen_buf), 2, of
9fb0: 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65  fset_v);..if (re
9fc0: 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66  ad_ret != sizeof
9fd0: 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09  (vlen_buf)) {...
9fe0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9ff0: 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64  NTF("Read failed
a000: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
a010: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
a020: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
a030: 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66  vlen = (vlen_buf
a040: 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e  [1] << 8) | vlen
a050: 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45  _buf[0];...CACKE
a060: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a070: 54 61 67 20 4c 65 6e 67 74 68 20 3d 20 25 69 2c  Tag Length = %i,
a080: 20 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20   Value Length = 
a090: 25 69 22 2c 20 74 6c 65 6e 2c 20 76 6c 65 6e 29  %i", tlen, vlen)
a0a0: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20  ;...offset_t += 
a0b0: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20  2;..offset_v += 
a0c0: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20  2;...if (tlen > 
a0d0: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29  sizeof(tval_buf)
a0e0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a0f0: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c  UG_PRINTF("Tag l
a100: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72  ength is too lar
a110: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ge, returning in
a120: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
a130: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
a140: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a  ..if (vlen > siz
a150: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b  eof(vval_buf)) {
a160: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a170: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65  PRINTF("Value le
a180: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
a190: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
a1a0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
a1b0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
a1c0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
a1d0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
a1e0: 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74  lot, tval_buf, t
a1f0: 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  len, 1, offset_t
a200: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
a210: 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41   != tlen) {...CA
a220: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a230: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
a240: 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65  d entire T-buffe
a250: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
a260: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
a270: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
a280: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
a290: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
a2a0: 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76  lot, vval_buf, v
a2b0: 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  len, 2, offset_v
a2c0: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
a2d0: 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41   != vlen) {...CA
a2e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a2f0: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
a300: 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65  d entire V-buffe
a310: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
a320: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
a330: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
a340: 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66  .tval = tval_buf
a350: 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62  ;..vval = vval_b
a360: 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e  uf;..while (tlen
a370: 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30   > 0 && vlen > 0
a380: 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61  ) {...tag = *tva
a390: 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74  l;...tval++;...t
a3a0: 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74  len--;....if (*t
a3b0: 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09  val == 0xff) {..
a3c0: 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c  ..length = (tval
a3d0: 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c  [2] << 8) | tval
a3e0: 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20  [1];....tval += 
a3f0: 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b  3;....tlen -= 3;
a400: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
a410: 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09  ength = *tval;..
a420: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65  ..tval++;....tle
a430: 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  n--;...}....CACK
a440: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a450: 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22  "Tag: %s (%02x)"
a460: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
a470: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74  UNC_TAG_TO_STR(t
a480: 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  ag), (unsigned i
a490: 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b  nt) tag);...CACK
a4a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
a4b0: 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c  F("Value:", vval
a4c0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75  , length);....cu
a4d0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  rr_entity = NULL
a4e0: 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29  ;...switch (tag)
a4f0: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
a500: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
a510: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
a520: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
a530: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
a540: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
a550: 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d  alue_cardurl = m
a560: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
a570: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
a580: 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09  _cardurl));.....
a590: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74  .memcpy(curr_ent
a5a0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
a5b0: 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35  rl->rid, vval, 5
a5c0: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
a5d0: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
a5e0: 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61  l->apptype = vva
a5f0: 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[5];.....curr_e
a600: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
a610: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d  durl->objectid =
a620: 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20   (vval[6] << 8) 
a630: 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63  | vval[7];.....c
a640: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
a650: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
a660: 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38   = (vval[8] << 8
a670: 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09  ) | vval[9];....
a680: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
a690: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
a6a0: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
a6b0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
a6c0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
a6d0: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
a6e0: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
a6f0: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
a700: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
a710: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
a720: 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a  alloc(length);..
a730: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
a740: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
a750: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
a760: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
a770: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a780: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
a790: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a7a0: 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66  ->value = tmpbuf
a7b0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
a7c0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
a7d0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
a7e0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
a7f0: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
a800: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
a810: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
a820: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  r_entity));.....
a830: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
a840: 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70  gth * 2;.....tmp
a850: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
a860: 62 75 66 6c 65 6e 29 3b 0a 0a 23 69 66 64 65 66  buflen);..#ifdef
a870: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 75   HAVE_LIBZ.....u
a880: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
a890: 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75  uncompress(tmpbu
a8a0: 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76  f, &tmpbuflen, v
a8b0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
a8c0: 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
a8d0: 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret != Z_OK) {.
a8e0: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a8f0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
a900: 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20   to decompress, 
a910: 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74  uncompress() ret
a920: 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f  urned %i -- reso
a930: 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20  rting to direct 
a940: 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73  copy", uncompres
a950: 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d  s_ret);.......tm
a960: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
a970: 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  ;......memcpy(tm
a980: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
a990: 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  th);.....}......
a9a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a9b0: 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
a9c0: 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
a9d0: 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65  , tmpbuflen);.#e
a9e0: 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  lse.....CACKEY_D
a9f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73  EBUG_PRINTF("Mis
aa00: 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72  sing ZLIB Suppor
aa10: 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63  t, this certific
aa20: 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73  ate is likely us
aa30: 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09  eless...");.....
aa40: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
aa50: 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  gth;.....memcpy(
aa60: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
aa70: 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ngth);.#endif...
aa80: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
aa90: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
aaa0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
aab0: 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  th = tmpbuflen;.
aac0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
aad0: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
aae0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
aaf0: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
ab00: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
ab10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
ab20: 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65  CS15:.....curr_e
ab30: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
ab40: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
ab50: 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ty));......curr_
ab60: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
ab70: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
ab80: 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d  ty->value_byte =
ab90: 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75   vval[0];.....cu
aba0: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
abb0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
abc0: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c  eak;...}....vval
abd0: 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c   += length;...vl
abe0: 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09  en -= length;...
abf0: 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79  .if (curr_entity
ac00: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
ac10: 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (root == NULL)
ac20: 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75   {.....root = cu
ac30: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
ac40: 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20  ....if (last != 
ac50: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74  NULL) {.....last
ac60: 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65  ->_next = curr_e
ac70: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
ac80: 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  last = curr_enti
ac90: 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ty;...}..}...ret
aca0: 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a  urn(root);.}../*
acb0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
acc0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
acd0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
ace0: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
acf0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
ad00: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
ad10: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
ad20: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
ad30: 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72  y_free_certs(str
ad40: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
ad50: 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c  identity *start,
ad60: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69   size_t count, i
ad70: 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b  nt free_start) {
ad80: 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09  ..size_t idx;...
ad90: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
ada0: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  x < count; idx++
adb0: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b  ) {...if (start[
adc0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
add0: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72  ) {....free(star
ade0: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
adf0: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  te);...}..}...if
ae00: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a   (free_start) {.
ae10: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09  ..free(start);..
ae20: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
ae30: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
ae40: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
ae50: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
ae60: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
ae70: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
ae80: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
ae90: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
aea0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
aeb0: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
aec0: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
aed0: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
aee0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
aef0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
af00: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72  sc_identity *cer
af10: 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ts, unsigned lon
af20: 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72  g *count) {..str
af30: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
af40: 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
af50: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
af60: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63  y_tlv_entity *cc
af70: 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72  c_tlv, *ccc_curr
af80: 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70  , *app_tlv, *app
af90: 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _curr;..unsigned
afa0: 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20   char ccc_aid[] 
afb0: 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43  = {GSCIS_AID_CCC
afc0: 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
afd0: 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09  r curr_aid[7];..
afe0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75  unsigned long ou
aff0: 74 69 64 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tidx = 0;..cacke
b000: 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74 69 6f  y_ret transactio
b010: 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 63 65 72 74  n_ret;..int cert
b020: 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e  s_resizable;..in
b030: 74 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65  t send_ret, sele
b040: 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ct_ret;...CACKEY
b050: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
b060: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
b070: 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  count == NULL) {
b080: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b090: 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73  PRINTF("count is
b0a0: 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67   NULL, returning
b0b0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
b0c0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
b0d0: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21  .}...if (certs !
b0e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
b0f0: 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  *count == 0) {..
b100: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b110: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64  RINTF("Requested
b120: 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a   we return 0 obj
b130: 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63  ects, short-circ
b140: 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  uit");.....retur
b150: 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
b160: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
b170: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
b180: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
b190: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
b1a0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
b1b0: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
b1c0: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
b1d0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
b1e0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
b1f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
b200: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
b210: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
b220: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
b230: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
b240: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
b250: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
b260: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
b270: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
b280: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
b290: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
b2a0: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
b2b0: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
b2c0: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65   = 0;..}.../* Se
b2d0: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
b2e0: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
b2f0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
b300: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
b310: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
b320: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
b330: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
b340: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
b350: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b360: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73  NTF("Unable to s
b370: 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74  elect CCC Applet
b380: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
b390: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20  ailure");..../* 
b3a0: 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
b3b0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b3c0: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
b3d0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b3e0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
b3f0: 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64  L);..}.../* Read
b400: 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
b410: 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
b420: 54 4c 56 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20  TLV */..ccc_tlv 
b430: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c  = cackey_read_tl
b440: 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f  v(slot);.../* Lo
b450: 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20  ok for CARDURLs 
b460: 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20  that coorespond 
b470: 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a  to PKI applets *
b480: 2f 0a 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72  /..for (ccc_curr
b490: 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f   = ccc_tlv; ccc_
b4a0: 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d  curr; ccc_curr =
b4b0: 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   ccc_curr->_next
b4c0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
b4d0: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
b4e0: 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20   tag: %s ... ", 
b4f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
b500: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63  C_TAG_TO_STR(ccc
b510: 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09  _curr->tag));...
b520: 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74  .if (ccc_curr->t
b530: 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
b540: 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 43 41  CARDURL) {....CA
b550: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b560: 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
b570: 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
b580: 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c  re about CARDURL
b590: 73 29 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  s)");.....contin
b5a0: 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ue;...}....if ((
b5b0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
b5c0: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
b5d0: 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
b5e0: 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
b5f0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
b600: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b610: 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
b620: 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
b630: 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b  ly care about PK
b640: 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20  I applets, this 
b650: 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a  applet supports:
b660: 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b   %s/%02x)", CACK
b670: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
b680: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63  PTYPE_TO_STR(ccc
b690: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b6a0: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20  durl->apptype), 
b6b0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63  (unsigned int) c
b6c0: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
b6d0: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
b6e0: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
b6f0: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
b700: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
b710: 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
b720: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
b730: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
b740: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b750: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 43 41 43 4b  l->rid));...CACK
b760: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b770: 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c  "AppID = %s/%04l
b780: 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
b790: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
b7a0: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
b7b0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
b7c0: 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
b7d0: 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
b7e0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
b7f0: 69 64 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  id);...CACKEY_DE
b800: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65  BUG_PRINTF("Obje
b810: 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ctID = %s/%04lx"
b820: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
b830: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
b840: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
b850: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
b860: 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
b870: 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
b880: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
b890: 6a 65 63 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63  jectid);....memc
b8a0: 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
b8b0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b8c0: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
b8d0: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
b8e0: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
b8f0: 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ;...curr_aid[siz
b900: 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
b910: 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e  2] = (ccc_curr->
b920: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
b930: 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66  ppid >> 8) & 0xf
b940: 66 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69  f;...curr_aid[si
b950: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
b960: 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e   1] = ccc_curr->
b970: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
b980: 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09  ppid & 0xff;....
b990: 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20  /* Select found 
b9a0: 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09  applet ... */...
b9b0: 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63  select_ret = cac
b9c0: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
b9d0: 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64  t(slot, curr_aid
b9e0: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  , sizeof(curr_ai
b9f0: 64 29 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63  d));...if (selec
ba00: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
ba10: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
ba20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ba30: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
ba40: 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b  elect applet, sk
ba50: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
ba60: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
ba70: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
ba80: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20  ;...}..../* ... 
ba90: 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
baa0: 29 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65  ) */...select_re
bab0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
bac0: 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63  t_file(slot, ccc
bad0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
bae0: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
baf0: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
bb00: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
bb10: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
bb20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bb30: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
bb40: 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67  t file, skipping
bb50: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
bb60: 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  his object");...
bb70: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
bb80: 0a 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .../* Process th
bb90: 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f  is file's TLV lo
bba0: 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66  oking for certif
bbb0: 69 63 61 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f  icates */...app_
bbc0: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
bbd0: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
bbe0: 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20  for (app_curr = 
bbf0: 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72  app_tlv; app_cur
bc00: 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70  r; app_curr = ap
bc10: 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  p_curr->_next) {
bc20: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
bc30: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
bc40: 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ag: %s", CACKEY_
bc50: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
bc60: 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e  O_STR(app_curr->
bc70: 74 61 67 29 29 3b 0a 09 09 09 69 66 20 28 61 70  tag));....if (ap
bc80: 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47  p_curr->tag != G
bc90: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
bca0: 43 41 54 45 29 20 7b 0a 09 09 09 09 43 41 43 4b  CATE) {.....CACK
bcb0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bcc0: 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
bcd0: 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
bce0: 20 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41   about CERTIFICA
bcf0: 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e  TEs)");......con
bd00: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
bd10: 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
bd20: 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74  [outidx];....out
bd30: 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70  idx++;.....memcp
bd40: 79 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  y(curr_id->apple
bd50: 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
bd60: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
bd70: 6c 65 74 29 29 3b 0a 09 09 09 63 75 72 72 5f 69  let));....curr_i
bd80: 64 2d 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75  d->file = ccc_cu
bd90: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
bda0: 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09  l->objectid;....
bdb0: 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65  curr_id->keysize
bdc0: 20 3d 20 2d 31 3b 0a 0a 09 09 09 43 41 43 4b 45   = -1;.....CACKE
bdd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bde0: 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d  Filling curr_id-
bdf0: 3e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74  >applet (%p) wit
be00: 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63  h %lu bytes:", c
be10: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
be20: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
be30: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
be40: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 43 41 43  applet));....CAC
be50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
be60: 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f  UF("VAL:", curr_
be70: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65  id->applet, size
be80: 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  of(curr_id->appl
be90: 65 74 29 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  et));.....curr_i
bea0: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
beb0: 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c  en = app_curr->l
bec0: 65 6e 67 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f  ength;.....curr_
bed0: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
bee0: 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
bef0: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
bf00: 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75  n);....memcpy(cu
bf10: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
bf20: 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61  te, app_curr->va
bf30: 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  lue, curr_id->ce
bf40: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
bf50: 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e  ....if (outidx >
bf60: 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  = *count) {.....
bf70: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
bf80: 62 6c 65 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75  ble) {......*cou
bf90: 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65  nt *= 2;......ce
bfa0: 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65  rts = realloc(ce
bfb0: 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72  rts, sizeof(*cer
bfc0: 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b  ts) * (*count));
bfd0: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
bfe0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
bff0: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ...}...}....cack
c000: 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f  ey_free_tlv(app_
c010: 74 6c 76 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74  tlv);....if (out
c020: 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
c030: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
c040: 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  }...cackey_free_
c050: 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09  tlv(ccc_tlv);...
c060: 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b  *count = outidx;
c070: 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
c080: 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74  izable) {...cert
c090: 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74  s = realloc(cert
c0a0: 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  s, sizeof(*certs
c0b0: 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09  ) * (*count));..
c0c0: 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  }.../* Terminate
c0d0: 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
c0e0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
c0f0: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
c100: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72  n(slot);...retur
c110: 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a  n(certs);.}../*.
c120: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
c130: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
c140: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
c150: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
c160: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
c170: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
c180: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
c190: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
c1a0: 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
c1b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c1c0: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
c1d0: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
c1e0: 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
c1f0: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
c200: 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75  size_t buflen, u
c210: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
c220: 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74  tbuf, size_t out
c230: 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49  buflen, int padI
c240: 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f  nput, int unpadO
c250: 75 74 70 75 74 29 20 7b 0a 09 75 6e 73 69 67 6e  utput) {..unsign
c260: 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c  ed char *tmpbuf,
c270: 20 2a 74 6d 70 62 75 66 5f 73 3b 0a 09 75 6e 73   *tmpbuf_s;..uns
c280: 69 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73  igned char bytes
c290: 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a 09 75  _to_send, p1;..u
c2a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f  nsigned char blo
c2b0: 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  cktype;..cackey_
c2c0: 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75  ret send_ret;..u
c2d0: 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65  int16_t respcode
c2e0: 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61  ;..ssize_t retva
c2f0: 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73  l = 0, unpadoffs
c300: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62  et;..size_t tmpb
c310: 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74  uflen, padlen, t
c320: 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 6e  mpoutbuflen;..in
c330: 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  t free_tmpbuf = 
c340: 30 2c 20 73 65 70 42 79 74 65 20 3d 20 2d 31 3b  0, sepByte = -1;
c350: 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b  ..int le;...CACK
c360: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c370: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
c380: 20 28 62 75 66 6c 65 6e 20 3e 20 32 35 35 29 20   (buflen > 255) 
c390: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c3a0: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
c3b0: 20 62 75 66 6c 65 6e 20 69 73 20 67 72 65 61 74   buflen is great
c3c0: 65 72 20 74 68 61 6e 20 32 35 35 20 28 62 75 66  er than 255 (buf
c3d0: 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e  len = %lu)", (un
c3e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66  signed long) buf
c3f0: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
c400: 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  -1);..}...if (sl
c410: 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ot == NULL) {...
c420: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c430: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f  NTF("Error.  slo
c440: 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  t is NULL");....
c450: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
c460: 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c  .if (buf == NULL
c470: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c480: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
c490: 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29  .  buf is NULL")
c4a0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
c4b0: 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66  ..}...if (outbuf
c4c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
c4d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c4e0: 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75  F("Error.  outbu
c4f0: 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  f is NULL");....
c500: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
c510: 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d  .if (identity ==
c520: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
c530: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c540: 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
c550: 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
c560: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
c570: 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  if (identity->pc
c580: 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  sc_identity == N
c590: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
c5a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
c5b0: 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e  ror.  identity->
c5c0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73  pcsc_identity is
c5d0: 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
c5e0: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  rn(-1);..}.../* 
c5f0: 44 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69  Determine identi
c600: 74 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09  ty Key size */..
c610: 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  if (identity->pc
c620: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
c630: 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64  size < 0) {...id
c640: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
c650: 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d  ntity->keysize =
c660: 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65   x509_to_keysize
c670: 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
c680: 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
c690: 69 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d  icate, identity-
c6a0: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
c6b0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
c6c0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65  ;..}.../* Pad me
c6d0: 73 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a  ssage to key siz
c6e0: 65 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70  e */..if (padInp
c6f0: 75 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e  ut) {...if (iden
c700: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
c710: 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30  ity->keysize > 0
c720: 29 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65  ) {....if (bufle
c730: 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  n != identity->p
c740: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
c750: 79 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20  ysize) {.....if 
c760: 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74  (buflen > (ident
c770: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
c780: 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29  ty->keysize + 3)
c790: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
c7a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
c7b0: 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73  ror.  Message is
c7c0: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69   too large to si
c7d0: 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09  gn/decrypt");...
c7e0: 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
c7f0: 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75  ....}......tmpbu
c800: 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  flen = identity-
c810: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
c820: 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70  keysize;.....tmp
c830: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
c840: 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65  buflen);.....fre
c850: 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09  e_tmpbuf = 1;...
c860: 09 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62  ...padlen = tmpb
c870: 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d  uflen - buflen -
c880: 20 33 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 5b   3;......tmpbuf[
c890: 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 74  0] = 0x00;.....t
c8a0: 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b  mpbuf[1] = 0x01;
c8b0: 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74 6d 70  .....memset(&tmp
c8c0: 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61  buf[2], 0xFF, pa
c8d0: 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75  dlen);.....tmpbu
c8e0: 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30  f[padlen + 2]= 0
c8f0: 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  x00;.....memcpy(
c900: 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b  &tmpbuf[padlen +
c910: 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e   3], buf, buflen
c920: 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
c930: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55  EBUG_PRINTBUF("U
c940: 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66 2c 20  npadded:", buf, 
c950: 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43  buflen);.....CAC
c960: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
c970: 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 74 6d  UF("Padded:", tm
c980: 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29  pbuf, tmpbuflen)
c990: 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
c9a0: 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a  ..tmpbuf = buf;.
c9b0: 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
c9c0: 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65  buflen;.....free
c9d0: 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09  _tmpbuf = 0;....
c9e0: 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09  .padlen = 0;....
c9f0: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
ca00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ca10: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 64  NTF("Unable to d
ca20: 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a  etermine key siz
ca30: 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20 6d 65  e, hoping the me
ca40: 73 73 61 67 65 20 69 73 20 70 72 6f 70 65 72 6c  ssage is properl
ca50: 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a 09 09  y padded!");....
ca60: 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09  .tmpbuf = buf;..
ca70: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75  ..tmpbuflen = bu
ca80: 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d  flen;....free_tm
ca90: 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 61 64  pbuf = 0;....pad
caa0: 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20  len = 0;...}..} 
cab0: 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75 66 20  else {...tmpbuf 
cac0: 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c  = buf;...tmpbufl
cad0: 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66  en = buflen;...f
cae0: 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a  ree_tmpbuf = 0;.
caf0: 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d  ..padlen = 0;..}
cb00: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e  .../* Begin tran
cb10: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b  saction */..cack
cb20: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
cb30: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a  tion(slot);.../*
cb40: 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20   Select correct 
cb50: 61 70 70 6c 65 74 20 2a 2f 0a 09 43 41 43 4b 45  applet */..CACKE
cb60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cb70: 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74  Selecting applet
cb80: 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e   found at %p ...
cb90: 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  ", identity->pcs
cba0: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c  c_identity->appl
cbb0: 65 74 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 6c  et);..cackey_sel
cbc0: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
cbd0: 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
cbe0: 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74  identity->applet
cbf0: 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74  , sizeof(identit
cc00: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
cc10: 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 2f 2a  ->applet));.../*
cc20: 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20   Select correct 
cc30: 66 69 6c 65 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  file */..cackey_
cc40: 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74  select_file(slot
cc50: 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
cc60: 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c 65 29  _identity->file)
cc70: 3b 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74  ;...tmpbuf_s = t
cc80: 6d 70 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74  mpbuf;..while (t
cc90: 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 69 66  mpbuflen) {...if
cca0: 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 32 34   (tmpbuflen > 24
ccb0: 35 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f  5) {....bytes_to
ccc0: 5f 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09 09 09  _send = 245;....
ccd0: 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 6c 65  p1 = 0x80;....le
cce0: 20 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73   = 0x00;...} els
ccf0: 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  e {....bytes_to_
cd00: 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e  send = tmpbuflen
cd10: 3b 0a 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a  ;....p1 = 0x00;.
cd20: 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
cd30: 7d 0a 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65  }....tmpoutbufle
cd40: 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a  n = outbuflen;..
cd50: 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
cd60: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
cd70: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
cd80: 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c  GLOBAL_PLATFORM,
cd90: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47   GSCIS_INSTR_SIG
cda0: 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78  NDECRYPT, p1, 0x
cdb0: 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e  00, bytes_to_sen
cdc0: 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26  d, tmpbuf, le, &
cdd0: 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66  respcode, outbuf
cde0: 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29  , &tmpoutbuflen)
cdf0: 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
ce00: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
ce10: 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
ce20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ce30: 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69  ADPU Sending Fai
ce40: 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67  led -- returning
ce50: 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09   in error.");...
ce60: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
ce70: 3d 20 30 78 36 39 38 32 29 20 7b 0a 09 09 09 09  = 0x6982) {.....
ce80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ce90: 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 73 74  NTF("Security st
cea0: 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66  atus not satisif
ceb0: 69 65 64 2e 22 29 3b 0a 09 09 09 7d 0a 0a 09 09  ied.");....}....
cec0: 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66  .if (free_tmpbuf
ced0: 29 20 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62  ) {.....if (tmpb
cee0: 75 66 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65  uf_s) {......fre
cef0: 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09  e(tmpbuf_s);....
cf00: 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45  .}....}...../* E
cf10: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nd transaction *
cf20: 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  /....cackey_end_
cf30: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
cf40: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
cf50: 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66  );...}....tmpbuf
cf60: 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e   += bytes_to_sen
cf70: 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d  d;...tmpbuflen -
cf80: 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b  = bytes_to_send;
cf90: 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d  ....outbuf += tm
cfa0: 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75  poutbuflen;...ou
cfb0: 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75  tbuflen -= tmpou
cfc0: 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61  tbuflen;...retva
cfd0: 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65  l += tmpoutbufle
cfe0: 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65  n;..}...if (free
cff0: 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20  _tmpbuf) {...if 
d000: 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09  (tmpbuf_s) {....
d010: 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
d020: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20  ..}..}.../* End 
d030: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
d040: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
d050: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23  action(slot);..#
d060: 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
d070: 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
d080: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
d090: 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e  .if (outbuflen >
d0a0: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
d0b0: 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
d0c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62  BUG_PRINTF("Outb
d0d0: 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61  uflen exceeds ma
d0e0: 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
d0f0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d100: 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
d110: 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22  utbuflen = %lu)"
d120: 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
d130: 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
d140: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
d150: 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  flen);....return
d160: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
d170: 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 55 6e  f.#endif.../* Un
d180: 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09 69 66  pad reply */..if
d190: 20 28 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b   (unpadOutput) {
d1a0: 0a 09 09 69 66 20 28 72 65 74 76 61 6c 20 3c 20  ...if (retval < 
d1b0: 32 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  2) {....CACKEY_D
d1c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 70  EBUG_PRINTF("Rep
d1d0: 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c  ly is too small,
d1e0: 20 77 65 20 61 72 65 20 6e 6f 74 20 61 62 6c 65   we are not able
d1f0: 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70 61 73   to unpad -- pas
d200: 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f  sing back and ho
d210: 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  ping for the bes
d220: 74 21 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  t!");.....return
d230: 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
d240: 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74  .blocktype = out
d250: 62 75 66 5b 30 5d 3b 0a 09 09 75 6e 70 61 64 6f  buf[0];...unpado
d260: 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77  ffset = 0;....sw
d270: 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 29  itch (blocktype)
d280: 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30 3a   {....case 0x00:
d290: 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
d2a0: 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66 69  Scheme 1, the fi
d2b0: 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  rst non-zero byt
d2c0: 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  e is the start o
d2d0: 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f  f data */.....fo
d2e0: 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
d2f0: 20 31 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   1; unpadoffset 
d300: 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
d310: 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
d320: 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
d330: 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30 29  offset] != 0x00)
d340: 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
d350: 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
d360: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
d370: 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x01:...../* Pad
d380: 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 70  ding Scheme 2, p
d390: 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78 46  ad bytes are 0xF
d3a0: 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78  F followed by 0x
d3b0: 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  00 */.....for (u
d3c0: 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 31 3b 20  npadoffset = 1; 
d3d0: 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
d3e0: 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
d3f0: 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
d400: 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
d410: 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a 09  et] != 0xFF) {..
d420: 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
d430: 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20  unpadoffset] == 
d440: 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09 75  0x00) {........u
d450: 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
d460: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
d470: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
d480: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d490: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
d4a0: 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75  padding data fou
d4b0: 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  nd, returning in
d4c0: 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64   failure, should
d4d0: 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30 20   have been 0x00 
d4e0: 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28  found 0x%02x", (
d4f0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75  unsigned int) ou
d500: 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
d510: 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 75  ]);.........retu
d520: 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a  rn(-1);.......}.
d530: 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
d540: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d550: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
d560: 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
d570: 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
d580: 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
d590: 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46 46  d have been 0xFF
d5a0: 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
d5b0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
d5c0: 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
d5d0: 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 75  t]);........retu
d5e0: 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09  rn(-1);......}..
d5f0: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
d600: 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
d610: 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
d620: 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65 73  eme 3, pad bytes
d630: 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69   are non-zero fi
d640: 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  rst non-zero byt
d650: 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65 20 70  e found is the p
d660: 61 64 20 62 79 74 65 20 2a 2f 0a 09 09 09 09 66  ad byte */.....f
d670: 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  or (unpadoffset 
d680: 3d 20 31 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  = 1; unpadoffset
d690: 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64   < retval; unpad
d6a0: 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09  offset++) {.....
d6b0: 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61  .if (outbuf[unpa
d6c0: 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30  doffset] == 0x00
d6d0: 29 20 7b 0a 09 09 09 09 09 09 63 6f 6e 74 69 6e  ) {.......contin
d6e0: 75 65 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ue;......}......
d6f0: 09 69 66 20 28 73 65 70 42 79 74 65 20 3d 3d 20  .if (sepByte == 
d700: 2d 31 29 20 7b 0a 09 09 09 09 09 09 73 65 70 42  -1) {.......sepB
d710: 79 74 65 20 3d 20 6f 75 74 62 75 66 5b 75 6e 70  yte = outbuf[unp
d720: 61 64 6f 66 66 73 65 74 5d 3b 0a 0a 09 09 09 09  adoffset];......
d730: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09  ..continue;.....
d740: 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 6f 75 74  .}.......if (out
d750: 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
d760: 20 3d 3d 20 73 65 70 42 79 74 65 29 20 7b 0a 09   == sepByte) {..
d770: 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
d780: 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ++;........break
d790: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
d7a0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
d7b0: 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74  .if (unpadoffset
d7c0: 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09   > retval) {....
d7d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d7e0: 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61  NTF("Offset grea
d7f0: 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73  ter than reply s
d800: 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20  ize, aborting.  
d810: 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25  (unpadoffset = %
d820: 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75  lu, retval = %lu
d830: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
d840: 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c  ng) unpadoffset,
d850: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
d860: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65   retval);.....re
d870: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
d880: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d890: 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22  INTBUF("Padded:"
d8a0: 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c  , outbuf, retval
d8b0: 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20  );....retval -= 
d8c0: 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d  unpadoffset;...m
d8d0: 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 20 2b 20  emmove(outbuf + 
d8e0: 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 6f 75 74  unpadoffset, out
d8f0: 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  buf, retval);...
d900: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d910: 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64  INTBUF("Unpadded
d920: 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76  :", outbuf, retv
d930: 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  al);..}....CACKE
d940: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d950: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
d960: 63 65 73 73 2c 20 73 69 67 6e 65 64 20 25 6c 69  cess, signed %li
d970: 20 62 79 74 65 73 22 2c 20 28 6c 6f 6e 67 29 20   bytes", (long) 
d980: 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
d990: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a  n(retval);.}../*
d9a0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
d9b0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
d9c0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
d9d0: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
d9e0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
d9f0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
da00: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
da10: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
da20: 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74   cackey_login(st
da30: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
da40: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
da50: 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69   char *pin, unsi
da60: 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65  gned long pin_le
da70: 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65  n, int *tries_re
da80: 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 6e  maining_p) {..un
da90: 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f  signed char cac_
daa0: 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20  pin[8] = {0xFF, 
dab0: 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
dac0: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
dad0: 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e 74  FF, 0xFF};..uint
dae0: 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f  16_t response_co
daf0: 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72  de;..int tries_r
db00: 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73  emaining;..int s
db10: 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e  end_ret;.../* In
db20: 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20 64  dicate that we d
db30: 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74  o not know about
db40: 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20   how many tries 
db50: 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f  are remaining */
db60: 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61  ..if (tries_rema
db70: 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72  ining_p) {...*tr
db80: 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20  ies_remaining_p 
db90: 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70  = -1;..}.../* Ap
dba0: 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49  parently, CAC PI
dbb0: 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a  Ns are *EXACTLY*
dbc0: 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d   8 bytes long --
dbd0: 20 70 61 64 20 77 69 74 68 20 30 78 46 46 20 69   pad with 0xFF i
dbe0: 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09  f too short */..
dbf0: 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38  if (pin_len >= 8
dc00: 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63  ) {...memcpy(cac
dc10: 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09  _pin, pin, 8);..
dc20: 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70  } else {...memcp
dc30: 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20  y(cac_pin, pin, 
dc40: 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f  pin_len);..}.../
dc50: 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65 72 69  * Issue PIN Veri
dc60: 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20  fy */..send_ret 
dc70: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
dc80: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
dc90: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
dca0: 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59  CIS_INSTR_VERIFY
dcb0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 73 69  , 0x00, 0x00, si
dcc0: 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63  zeof(cac_pin), c
dcd0: 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72  ac_pin, 0x00, &r
dce0: 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55  esponse_code, NU
dcf0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  LL, NULL);..if (
dd00: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
dd10: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
dd20: 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f  ..if ((response_
dd30: 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d  code & 0x63C0) =
dd40: 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74  = 0x63C0) {....t
dd50: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
dd60: 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20   (response_code 
dd70: 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b  & 0xF);.....CACK
dd80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
dd90: 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f  "PIN Verificatio
dda0: 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69  n failed, %i tri
ddb0: 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74  es remaining", t
ddc0: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b  ries_remaining);
ddd0: 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72  .....if (tries_r
dde0: 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09  emaining_p) {...
ddf0: 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ..*tries_remaini
de00: 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d  ng_p = tries_rem
de10: 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09  aining;....}....
de20: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
de30: 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09  CSC_E_BADPIN);..
de40: 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e  .}....if (respon
de50: 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38  se_code == 0x698
de60: 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  3) {....CACKEY_D
de70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
de80: 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61   Verification fa
de90: 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 20  iled, device is 
dea0: 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65  locked");.....re
deb0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
dec0: 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a  _E_LOCKED);...}.
ded0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
dee0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
def0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
df00: 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
df10: 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63  Verification suc
df20: 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75  ceeded");...retu
df30: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
df40: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
df50: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
df60: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
df70: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
df80: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
df90: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
dfa0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
dfb0: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
dfc0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
dfd0: 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
dfe0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
dff0: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
e000: 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
e010: 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
e020: 44 20 72 65 61 64 65 72 5f 6c 65 6e 2c 20 73 74  D reader_len, st
e030: 61 74 65 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20 61  ate, protocol, a
e040: 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74  tr_len;..BYTE at
e050: 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b  r[MAX_ATR_SIZE];
e060: 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f 72 65  ..LONG status_re
e070: 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  t, scard_reconn_
e080: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
e090: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
e0a0: 65 64 2e 22 29 3b 0a 0a 09 70 63 73 63 5f 63 6f  ed.");...pcsc_co
e0b0: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
e0c0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
e0d0: 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63  slot);..if (pcsc
e0e0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
e0f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
e100: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
e110: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
e120: 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
e130: 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
e140: 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a  token absent");.
e150: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
e160: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53  _PCSC_S_TOKENABS
e170: 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c  ENT);..}...atr_l
e180: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29  en = sizeof(atr)
e190: 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ;..status_ret = 
e1a0: 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
e1b0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c  ->pcsc_card, NUL
e1c0: 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20  L, &reader_len, 
e1d0: 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f  &state, &protoco
e1e0: 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e  l, atr, &atr_len
e1f0: 29 3b 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72  );..if (status_r
e200: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
e210: 43 43 45 53 53 29 20 7b 0a 09 09 73 6c 6f 74 2d  CCESS) {...slot-
e220: 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  >slot_reset = 1;
e230: 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66  ...slot->token_f
e240: 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
e250: 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 69 66  _REQUIRED;....if
e260: 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20   (status_ret == 
e270: 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41  SCARD_W_RESET_CA
e280: 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  RD) {....CACKEY_
e290: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e2a0: 73 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c  set required, pl
e2b0: 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a  ease hold...");.
e2c0: 0a 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ......scard_reco
e2d0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
e2e0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
e2f0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
e300: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
e310: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
e320: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
e330: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
e340: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e  .if (scard_recon
e350: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  n_ret == SCARD_S
e360: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
e370: 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20  /* Re-establish 
e380: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
e390: 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a  it was present *
e3a0: 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e  /.....if (slot->
e3b0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
e3c0: 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  h > 0) {......sl
e3d0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
e3e0: 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61  depth--;......ca
e3f0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
e400: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09  action(slot);...
e410: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
e420: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e430: 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20  set successful, 
e440: 72 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09  requerying");...
e450: 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53  ..status_ret = S
e460: 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d  CardStatus(slot-
e470: 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c  >pcsc_card, NULL
e480: 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26  , &reader_len, &
e490: 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c  state, &protocol
e4a0: 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29  , atr, &atr_len)
e4b0: 3b 0a 09 09 09 09 69 66 20 28 73 74 61 74 75 73  ;.....if (status
e4c0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
e4d0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09  SUCCESS) {......
e4e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e4f0: 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c  NTF("Still unabl
e500: 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20  e to query card 
e510: 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e  status, returnin
e520: 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  g token absent. 
e530: 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d   SCardStatus() =
e540: 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
e550: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
e560: 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72  _TO_STR(status_r
e570: 65 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  et));.......retu
e580: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
e590: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
e5a0: 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
e5b0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
e5c0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
e5d0: 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f   to reconnect to
e5e0: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
e5f0: 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20   token absent.  
e600: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
e610: 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44   = %s", CACKEY_D
e620: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
e630: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
e640: 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09  reconn_ret));...
e650: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
e660: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53  _PCSC_S_TOKENABS
e670: 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65  ENT);....}...} e
e680: 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
e690: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
e6a0: 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61  able to query ca
e6b0: 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72  rd status, retur
e6c0: 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
e6d0: 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28  t.  SCardStatus(
e6e0: 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ) = %s", CACKEY_
e6f0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
e700: 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75  ERR_TO_STR(statu
e710: 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74  s_ret));.....ret
e720: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
e730: 53 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  S_TOKENABSENT);.
e740: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74  ..}..}...if ((st
e750: 61 74 65 20 26 20 53 43 41 52 44 5f 41 42 53 45  ate & SCARD_ABSE
e760: 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53  NT) == SCARD_ABS
e770: 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
e780: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
e790: 72 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65  rd is absent, re
e7a0: 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
e7b0: 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72  sent");....retur
e7c0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
e7d0: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d  TOKENABSENT);..}
e7e0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e7f0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
e800: 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e  g token present.
e810: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
e820: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
e830: 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a  PRESENT);.}../*.
e840: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
e850: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
e860: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
e870: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
e880: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
e890: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
e8a0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
e8b0: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
e8c0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
e8d0: 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63  y_to_label(struc
e8e0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
e8f0: 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
e900: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
e910: 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69  *label_buf, unsi
e920: 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f  gned long label_
e930: 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69  buf_len) {..unsi
e940: 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66  gned long certif
e950: 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 63 68 61 72  icate_len;..char
e960: 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76   *label_asn1;..v
e970: 6f 69 64 20 2a 63 65 72 74 69 66 69 63 61 74 65  oid *certificate
e980: 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64  ;..int x509_read
e990: 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63  _ret;...certific
e9a0: 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  ate = identity->
e9b0: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65  certificate;..ce
e9c0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
e9d0: 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
e9e0: 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20  icate_len;...if 
e9f0: 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
ea00: 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e   < 0) {...return
ea10: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f  (-1);..}...x509_
ea20: 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
ea30: 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69  to_subject(certi
ea40: 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
ea50: 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a  ate_len, (void *
ea60: 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b  *) &label_asn1);
ea70: 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
ea80: 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  ret < 0) {...ret
ea90: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35  urn(-1);..}...x5
eaa0: 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
eab0: 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28  09_dn_to_string(
eac0: 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39  label_asn1, x509
ead0: 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72  _read_ret, (char
eae0: 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c   *) label_buf, l
eaf0: 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43  abel_buf_len, "C
eb00: 4e 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72  N");..if (x509_r
eb10: 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ead_ret <= 0) {.
eb20: 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
eb30: 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72  = x509_dn_to_str
eb40: 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20  ing(label_asn1, 
eb50: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28  x509_read_ret, (
eb60: 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75  char *) label_bu
eb70: 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e  f, label_buf_len
eb80: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28  , NULL);....if (
eb90: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d  x509_read_ret <=
eba0: 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28   0) {....return(
ebb0: 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66  -1);...}..}..#if
ebc0: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e  def CACKEY_PARAN
ebd0: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f  OID.#  ifdef _PO
ebe0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69  SIX_SSIZE_MAX..i
ebf0: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
ec00: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
ec10: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
ec20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35  DEBUG_PRINTF("x5
ec30: 30 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65  09_read_ret exce
ec40: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
ec50: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
ec60: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
ec70: 25 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72  %li, x509_read_r
ec80: 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e  et = %lu)", (lon
ec90: 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  g) _POSIX_SSIZE_
eca0: 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  MAX, (unsigned l
ecb0: 6f 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72  ong) x509_read_r
ecc0: 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  et);....return(-
ecd0: 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a  1);..}.#  endif.
ece0: 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28  #endif...return(
ecf0: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a  x509_read_ret);.
ed00: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20  }../* Returns 0 
ed10: 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74  on success */.st
ed20: 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
ed30: 6d 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69  mutex_create(voi
ed40: 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74  d **mutex) {..pt
ed50: 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
ed60: 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69  thread_mutex;..i
ed70: 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  nt pthread_retva
ed80: 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d  l;..CK_RV custom
ed90: 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
eda0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
edb0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
edc0: 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ((cackey_args.fl
edd0: 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags & CKF_OS_LOC
ede0: 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f  KING_OK) == CKF_
edf0: 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b  OS_LOCKING_OK) {
ee00: 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
ee10: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
ee20: 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  (*pthread_mutex)
ee30: 29 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65 61  );...if (!pthrea
ee40: 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41  d_mutex) {....CA
ee50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ee60: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c  F("Failed to all
ee70: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b  ocate memory.");
ee80: 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
ee90: 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f  ...}....pthread_
eea0: 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64  retval = pthread
eeb0: 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72  _mutex_init(pthr
eec0: 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29  ead_mutex, NULL)
eed0: 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f  ;...if (pthread_
eee0: 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
eef0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ef00: 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d  RINTF("pthread_m
ef10: 75 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75  utex_init() retu
ef20: 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e  rned error (%i).
ef30: 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  ", pthread_retva
ef40: 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
ef50: 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65  1);...}....*mute
ef60: 78 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  x = pthread_mute
ef70: 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  x;..} else {...i
ef80: 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  f (cackey_args.C
ef90: 72 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09  reateMutex) {...
efa0: 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
efb0: 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65   cackey_args.Cre
efc0: 61 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ateMutex(mutex);
efd0: 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
efe0: 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
eff0: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
f000: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
f010: 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
f020: 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
f030: 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
f040: 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
f050: 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
f060: 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
f070: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
f080: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
f090: 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
f0a0: 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
f0b0: 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  0);.}../* Return
f0c0: 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  s 0 on success *
f0d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
f0e0: 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76  key_mutex_lock(v
f0f0: 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70  oid *mutex) {..p
f100: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
f110: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
f120: 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
f130: 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
f140: 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
f150: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f160: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
f170: 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
f180: 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
f190: 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
f1a0: 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
f1b0: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
f1c0: 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74  x = mutex;....pt
f1d0: 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
f1e0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
f1f0: 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  k(pthread_mutex)
f200: 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f  ;...if (pthread_
f210: 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
f220: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f230: 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d  RINTF("pthread_m
f240: 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75  utex_lock() retu
f250: 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e  rned error (%i).
f260: 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  ", pthread_retva
f270: 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
f280: 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
f290: 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
f2a0: 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b  rgs.LockMutex) {
f2b0: 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61  ....custom_retva
f2c0: 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e  l = cackey_args.
f2d0: 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29  LockMutex(mutex)
f2e0: 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d  ;.....if (custom
f2f0: 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f  _retval != CKR_O
f300: 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
f310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
f320: 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
f330: 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
f340: 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
f350: 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
f360: 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
f370: 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
f380: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
f390: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
f3a0: 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
f3b0: 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
f3c0: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
f3d0: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
f3e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
f3f0: 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
f400: 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09  void *mutex) {..
f410: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
f420: 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a  *pthread_mutex;.
f430: 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74  .int pthread_ret
f440: 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74  val;..CK_RV cust
f450: 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  om_retval;...CAC
f460: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f470: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
f480: 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  f ((cackey_args.
f490: 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c  flags & CKF_OS_L
f4a0: 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b  OCKING_OK) == CK
f4b0: 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
f4c0: 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   {...pthread_mut
f4d0: 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70  ex = mutex;....p
f4e0: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20  thread_retval = 
f4f0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
f500: 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74  lock(pthread_mut
f510: 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  ex);...if (pthre
f520: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
f530: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
f540: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
f550: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29  d_mutex_unlock()
f560: 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
f570: 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
f580: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
f590: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20  urn(-1);...}..} 
f5a0: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
f5b0: 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
f5c0: 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f  utex) {....custo
f5d0: 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  m_retval = cacke
f5e0: 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
f5f0: 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69  ex(mutex);.....i
f600: 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  f (custom_retval
f610: 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
f620: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f630: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72  RINTF("cackey_ar
f640: 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29  gs.UnlockMutex()
f650: 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
f660: 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
f670: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
f680: 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
f690: 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
f6a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f6b0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
f6c0: 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
f6d0: 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
f6e0: 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49  .static CK_ATTRI
f6f0: 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f  BUTE_PTR cackey_
f700: 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43  get_attributes(C
f710: 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f  K_OBJECT_CLASS o
f720: 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75  bjectclass, stru
f730: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
f740: 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
f750: 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  y, unsigned long
f760: 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43   identity_num, C
f770: 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43  K_ULONG_PTR pulC
f780: 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20  ount) {..static 
f790: 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65  CK_BBOOL ck_true
f7a0: 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b   = 1;..static CK
f7b0: 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20  _BBOOL ck_false 
f7c0: 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e  = 0;..CK_ULONG n
f7d0: 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74  umattrs = 0, ret
f7e0: 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41  val_count;..CK_A
f7f0: 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63 75  TTRIBUTE_TYPE cu
f800: 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43  rr_attr_type;..C
f810: 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72 72  K_ATTRIBUTE curr
f820: 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a  _attr, *retval;.
f830: 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61  .CK_VOID_PTR pVa
f840: 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  lue;..CK_ULONG u
f850: 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f  lValueLen;..CK_O
f860: 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f  BJECT_CLASS ck_o
f870: 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b  bject_class;..CK
f880: 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
f890: 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65  E ck_certificate
f8a0: 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54  _type;..CK_KEY_T
f8b0: 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b  YPE ck_key_type;
f8c0: 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63  ..CK_UTF8CHAR uc
f8d0: 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 75  TmpBuf[1024];..u
f8e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
f8f0: 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a  rtificate;..ssiz
f900: 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f  e_t certificate_
f910: 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72  len = -1, x509_r
f920: 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56  ead_ret;..int pV
f930: 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43  alue_free;...CAC
f940: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f950: 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74  ("Called (object
f960: 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65  Class = %lu, ide
f970: 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29  ntity_num = %lu)
f980: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
f990: 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c  ng) objectclass,
f9a0: 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a   identity_num);.
f9b0: 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
f9c0: 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
f9d0: 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c  CATE && objectcl
f9e0: 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass != CKO_PUBLI
f9f0: 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63  C_KEY && objectc
fa00: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56  lass != CKO_PRIV
fa10: 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 43 41 43  ATE_KEY) {...CAC
fa20: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fa30: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
fa40: 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e  jects (NULL), in
fa50: 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61  valid object cla
fa60: 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ss");....return(
fa70: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47  NULL);..}.../* G
fa80: 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28  et Cert */..if (
fa90: 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c  identity == NULL
faa0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
fab0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
fac0: 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
fad0: 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69  NULL), invalid i
fae0: 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22  dentiy provided"
faf0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
fb00: 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69  L);..}...certifi
fb10: 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  cate = identity-
fb20: 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63  >certificate;..c
fb30: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
fb40: 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
fb50: 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66  ficate_len;...if
fb60: 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
fb70: 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69  n == -1 || certi
fb80: 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  ficate == NULL) 
fb90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
fba0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
fbb0: 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55  ng 0 objects (NU
fbc0: 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69  LL), this identi
fbd0: 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ty does not have
fbe0: 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66   an X.509 certif
fbf0: 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64  icate associated
fc00: 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c   with it and wil
fc10: 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09  l not work");...
fc20: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
fc30: 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
fc40: 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20 69  at certificate i
fc50: 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20  s ASN.1 encoded 
fc60: 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
fc70: 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74  e */..if (x509_t
fc80: 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69  o_serial(certifi
fc90: 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
fca0: 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30  e_len, NULL) < 0
fcb0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
fcc0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
fcd0: 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
fce0: 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39  NULL), the X.509
fcf0: 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73   certificate ass
fd00: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
fd10: 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f  s identity is no
fd20: 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65  t valid");....re
fd30: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
fd40: 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20  .retval_count = 
fd50: 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  16;..retval = ma
fd60: 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e  lloc(retval_coun
fd70: 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
fd80: 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72  al));...for (cur
fd90: 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b  r_attr_type = 0;
fda0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20   curr_attr_type 
fdb0: 3c 20 30 78 63 65 35 33 36 33 35 66 3b 20 63 75  < 0xce53635f; cu
fdc0: 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20  rr_attr_type++) 
fdd0: 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  {...if (curr_att
fde0: 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29  r_type == 0x800)
fdf0: 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f   {....curr_attr_
fe00: 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33 30  type = 0xce53630
fe10: 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65  0;...}....pValue
fe20: 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61  _free = 0;...pVa
fe30: 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c  lue = NULL;...ul
fe40: 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
fe50: 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74  ONG) -1;....swit
fe60: 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  ch (curr_attr_ty
fe70: 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b  pe) {....case CK
fe80: 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43  A_CLASS:.....CAC
fe90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fea0: 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
feb0: 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53  ribute CKA_CLASS
fec0: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
fed0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
fee0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
fef0: 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74  ;......ck_object
ff00: 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63  _class = objectc
ff10: 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75  lass;......pValu
ff20: 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63  e = &ck_object_c
ff30: 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75  lass;.....ulValu
ff40: 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
ff50: 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a  _object_class);.
ff60: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
ff70: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
ff80: 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
ff90: 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
ffa0: 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42  d long) *((CK_OB
ffb0: 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56  JECT_CLASS *) pV
ffc0: 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
ffd0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
ffe0: 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
fff0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
10000 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43  CKA_TOKEN:.....C
10010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10020 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
10030 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b  ttribute CKA_TOK
10040 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  EN (0x%08lx) ...
10050 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
10060 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
10070 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
10080 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
10090 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
100a0 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
100b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
100c0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
100d0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
100e0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
100f0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
10100 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
10110 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
10120 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
10130 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
10140 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46  ..case CKA_MODIF
10150 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45  IABLE:.....CACKE
10160 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10170 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
10180 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  bute CKA_MODIFIA
10190 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BLE (0x%08lx) ..
101a0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
101b0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
101c0 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
101d0 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
101e0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
101f0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
10200 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
10210 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
10220 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
10230 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
10240 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
10250 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
10260 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
10270 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
10280 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
10290 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41  ;....case CKA_LA
102a0 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BEL:.....CACKEY_
102b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
102c0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
102d0 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78  te CKA_LABEL (0x
102e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
102f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
10300 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
10310 09 09 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
10320 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 78 35 30 39  name */.....x509
10330 5f 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  _read_ret = cack
10340 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
10350 5f 74 6f 5f 6c 61 62 65 6c 28 69 64 65 6e 74 69  _to_label(identi
10360 74 79 2c 20 75 63 54 6d 70 42 75 66 2c 20 73 69  ty, ucTmpBuf, si
10370 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29 3b  zeof(ucTmpBuf));
10380 0a 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
10390 61 64 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09  ad_ret > 0) {...
103a0 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d  ...pValue = ucTm
103b0 70 42 75 66 3b 0a 09 09 09 09 09 75 6c 56 61 6c  pBuf;......ulVal
103c0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
103d0 64 5f 72 65 74 3b 0a 09 09 09 09 7d 0a 0a 09 09  d_ret;.....}....
103e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
103f0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
10400 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
10410 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
10420 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
10430 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
10440 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41  ;....case CKA_VA
10450 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  LUE:.....CACKEY_
10460 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10470 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
10480 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78  te CKA_VALUE (0x
10490 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
104a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
104b0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
104c0 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63  ...switch (objec
104d0 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63  tclass) {......c
104e0 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f  ase CKO_PRIVATE_
104f0 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  KEY:.......CACKE
10500 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10510 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
10520 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
10530 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74 65  we are a private
10540 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09   key.");........
10550 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
10560 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a   CKO_PUBLIC_KEY:
10570 0a 09 09 09 09 09 09 2f 2a 20 58 58 58 3a 20 54  ......./* XXX: T
10580 4f 44 4f 20 2a 2f 0a 0a 09 09 09 09 09 09 62 72  ODO */........br
10590 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43  eak;......case C
105a0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  KO_CERTIFICATE:.
105b0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63  ......pValue = c
105c0 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09  ertificate;.....
105d0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63  ..ulValueLen = c
105e0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
105f0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
10600 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
10610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
10620 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
10630 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
10640 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
10650 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
10660 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
10670 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43  KA_ISSUER:.....C
10680 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10690 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
106a0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53  ttribute CKA_ISS
106b0 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  UER (0x%08lx) ..
106c0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
106d0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
106e0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
106f0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
10700 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
10710 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10720 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
10730 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
10740 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
10750 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
10760 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  te.");.......bre
10770 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
10780 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
10790 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
107a0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
107b0 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63  x509_to_issuer(c
107c0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
107d0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
107e0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
107f0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
10800 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
10810 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
10820 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
10830 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
10840 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
10850 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
10860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10870 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
10880 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
10890 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
108a0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
108b0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
108c0 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d  e CKA_SERIAL_NUM
108d0 42 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BER:.....CACKEY_
108e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
108f0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
10900 74 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  te CKA_SERIAL_NU
10910 4d 42 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  MBER (0x%08lx) .
10920 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
10930 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
10940 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
10950 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
10960 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
10970 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
10980 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
10990 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
109a0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
109b0 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
109c0 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  ate.");.......br
109d0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
109e0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
109f0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
10a00 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
10a10 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28   x509_to_serial(
10a20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
10a30 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
10a40 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
10a50 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
10a60 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
10a70 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
10a80 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
10a90 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
10aa0 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
10ab0 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
10ac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10ad0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
10ae0 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
10af0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
10b00 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
10b10 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10b20 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54  case CKA_SUBJECT
10b30 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
10b40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
10b50 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
10b60 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78 25  CKA_SUBJECT (0x%
10b70 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
10b80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
10b90 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
10ba0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
10bb0 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
10bc0 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43  CATE) {......CAC
10bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10be0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
10bf0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
10c00 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
10c10 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a  ertificate.");..
10c20 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
10c30 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
10c40 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
10c50 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
10c60 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
10c70 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63  subject(certific
10c80 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
10c90 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
10ca0 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
10cb0 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
10cc0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
10cd0 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
10ce0 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
10cf0 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
10d00 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
10d10 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10d20 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
10d30 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
10d40 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
10d50 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
10d60 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
10d70 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49  k;....case CKA_I
10d80 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  D:.....CACKEY_DE
10d90 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
10da0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
10db0 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c 78   CKA_ID (0x%08lx
10dc0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
10dd0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
10de0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 75 63  r_type);......uc
10df0 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64  TmpBuf[0] = ((id
10e00 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20  entity_num + 1) 
10e10 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09  >> 8) & 0xff;...
10e20 09 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20  ..ucTmpBuf[1] = 
10e30 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b   (identity_num +
10e40 20 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09   1) & 0xff;.....
10e50 09 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70  .pValue = &ucTmp
10e60 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  Buf;.....ulValue
10e70 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41  Len = 2;......CA
10e80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10e90 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
10ea0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
10eb0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
10ec0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
10ed0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
10ee0 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43  ase CKA_CERTIFIC
10ef0 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41  ATE_TYPE:.....CA
10f00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10f10 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
10f20 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54  tribute CKA_CERT
10f30 49 46 49 43 41 54 45 5f 54 59 50 45 20 28 30 78  IFICATE_TYPE (0x
10f40 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
10f50 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
10f60 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
10f70 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
10f80 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
10f90 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
10fa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10fb0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
10fc0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
10fd0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
10fe0 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a  certificate.");.
10ff0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
11000 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e  .}....../* We on
11010 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63  ly support one c
11020 65 72 74 69 66 69 63 61 74 65 20 74 79 70 65 20  ertificate type 
11030 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66  */.....ck_certif
11040 69 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43  icate_type = CKC
11050 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61  _X_509;......pVa
11060 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66  lue = &ck_certif
11070 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09  icate_type;.....
11080 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
11090 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61  eof(ck_certifica
110a0 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43  te_type);......C
110b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
110c0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
110d0 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c  ng CKC_X_509 (%l
110e0 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  u) (%p/%lu)", (u
110f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
11100 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  (CK_CERTIFICATE_
11110 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c  TYPE *) pValue),
11120 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
11130 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
11140 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
11150 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45  ;....case CKA_KE
11160 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b  Y_TYPE:.....CACK
11170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11180 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
11190 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59  ibute CKA_KEY_TY
111a0 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PE (0x%08lx) ...
111b0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
111c0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
111d0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
111e0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
111f0 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f  PRIVATE_KEY && o
11200 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
11210 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a  O_PUBLIC_KEY) {.
11220 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
11230 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
11240 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
11250 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
11260 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a   not a key.");..
11270 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
11280 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c  }....../* We onl
11290 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65  y support one ke
112a0 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b  y type */.....ck
112b0 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f  _key_type = CKK_
112c0 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  RSA;......pValue
112d0 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b   = &ck_key_type;
112e0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
112f0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f  = sizeof(ck_key_
11300 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  type);......CACK
11310 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11320 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
11330 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25  CKK_RSA (%lu) (%
11340 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
11350 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43  ed long) *((CK_C
11360 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
11370 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
11380 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
11390 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
113a0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
113b0 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09  case CKA_SIGN:..
113c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
113d0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
113e0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
113f0 5f 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20  _SIGN (0x%08lx) 
11400 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
11410 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
11420 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
11430 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
11440 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20  KO_PRIVATE_KEY) 
11450 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
11460 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
11470 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
11480 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
11490 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
114a0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
114b0 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
114c0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
114d0 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
114e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
114f0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
11500 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
11510 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
11520 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
11530 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
11540 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
11550 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
11560 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
11570 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52  .case CKA_SIGN_R
11580 45 43 4f 56 45 52 3a 0a 09 09 09 09 43 41 43 4b  ECOVER:.....CACK
11590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
115a0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
115b0 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 5f 52  ibute CKA_SIGN_R
115c0 45 43 4f 56 45 52 20 28 30 78 25 30 38 6c 78 29  ECOVER (0x%08lx)
115d0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
115e0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
115f0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
11600 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
11610 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
11620 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
11630 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
11640 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
11650 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
11660 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
11670 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
11680 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
11690 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
116a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
116b0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
116c0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
116d0 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41  _DECRYPT:.....CA
116e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
116f0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
11700 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52  tribute CKA_DECR
11710 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPT (0x%08lx) ..
11720 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
11730 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
11740 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
11750 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
11760 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20  _PRIVATE_KEY || 
11770 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
11780 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b  KO_PUBLIC_KEY) {
11790 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
117a0 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
117b0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
117c0 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
117d0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
117e0 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
117f0 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
11800 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
11810 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
11820 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11830 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
11840 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
11850 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
11860 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
11870 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
11880 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
11890 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
118a0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
118b0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53  case CKA_TRUST_S
118c0 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 09  ERVER_AUTH:.....
118d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
118e0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
118f0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
11900 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 20  UST_SERVER_AUTH 
11910 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
11920 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
11930 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
11940 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
11950 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
11960 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
11970 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
11980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11990 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
119a0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
119b0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
119c0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
119d0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
119e0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
119f0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
11a00 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
11a10 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c  ase CKA_TRUST_CL
11a20 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 09 43  IENT_AUTH:.....C
11a30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11a40 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
11a50 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
11a60 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 20 28  ST_CLIENT_AUTH (
11a70 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
11a80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
11a90 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
11aa0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
11ab0 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
11ac0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
11ad0 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
11ae0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11af0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
11b00 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
11b10 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11b20 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
11b30 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
11b40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11b50 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
11b60 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
11b70 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44  se CKA_TRUST_COD
11b80 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 09 43  E_SIGNING:.....C
11b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ba0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
11bb0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
11bc0 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 20  ST_CODE_SIGNING 
11bd0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
11be0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
11bf0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
11c00 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
11c10 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
11c20 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
11c30 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
11c40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11c50 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
11c60 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
11c70 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
11c80 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
11c90 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
11ca0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
11cb0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
11cc0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
11cd0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ase CKA_TRUST_EM
11ce0 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a  AIL_PROTECTION:.
11cf0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11d00 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
11d10 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
11d20 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52  A_TRUST_EMAIL_PR
11d30 4f 54 45 43 54 49 4f 4e 20 28 30 78 25 30 38 6c  OTECTION (0x%08l
11d40 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
11d50 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
11d60 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
11d70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
11d80 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
11d90 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
11da0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
11db0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
11dc0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
11dd0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
11de0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
11df0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
11e00 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
11e10 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
11e20 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
11e30 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a  eak;....default:
11e40 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
11e50 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  LL;.....ulValueL
11e60 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
11e70 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  1;.....break;...
11e80 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f  }....if (((CK_LO
11e90 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20  NG) ulValueLen) 
11ea0 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  != ((CK_LONG) -1
11eb0 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20  )) {..../* Push 
11ec0 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74  curr_attr onto t
11ed0 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63  he stack */....c
11ee0 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20  urr_attr.type = 
11ef0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a  curr_attr_type;.
11f00 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  ...curr_attr.ulV
11f10 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75  alueLen = ulValu
11f20 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61  eLen;.....curr_a
11f30 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c  ttr.pValue = mal
11f40 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c  loc(curr_attr.ul
11f50 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65  ValueLen);....me
11f60 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70  mcpy(curr_attr.p
11f70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63  Value, pValue, c
11f80 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
11f90 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56  Len);.....if (pV
11fa0 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 61  alue_free && pVa
11fb0 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28  lue) {.....free(
11fc0 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09  pValue);....}...
11fd0 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e  ..if (numattrs >
11fe0 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20  = retval_count) 
11ff0 7b 0a 09 09 09 09 72 65 74 76 61 6c 5f 63 6f 75  {.....retval_cou
12000 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 72 65 74  nt *= 2;.....ret
12010 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65  val = realloc(re
12020 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75  tval, retval_cou
12030 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
12040 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  val));....}.....
12050 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e  memcpy(&retval[n
12060 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f  umattrs], &curr_
12070 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72  attr, sizeof(cur
12080 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d  r_attr));....num
12090 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  attrs++;...}..}.
120a0 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21  ..if (numattrs !
120b0 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f  = 0) {...retval_
120c0 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  count = numattrs
120d0 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ;...retval = rea
120e0 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
120f0 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
12100 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d  of(*retval));..}
12110 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72   else {...free(r
12120 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61  etval);....retva
12130 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a  l = NULL;..}...*
12140 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74  pulCount = numat
12150 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  trs;...CACKEY_DE
12160 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
12170 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74  rning %lu object
12180 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74  s (%p).", numatt
12190 72 73 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  rs, retval);...r
121a0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
121b0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  ..static void ca
121c0 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
121d0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
121e0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
121f0 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65  ntities, unsigne
12200 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65  d long identitie
12210 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  s_count) {..CK_A
12220 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
12230 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ttr;..unsigned l
12240 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72  ong id_idx, attr
12250 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e  _idx;...if (iden
12260 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c  tities == NULL |
12270 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  | identities_cou
12280 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74  nt == 0) {...ret
12290 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  urn;..}...for (i
122a0 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64  d_idx = 0; id_id
122b0 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63  x < identities_c
122c0 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20  ount; id_idx++) 
122d0 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69  {...if (identiti
122e0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
122f0 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20  butes) {....for 
12300 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61  (attr_idx = 0; a
12310 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69  ttr_idx < identi
12320 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
12330 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61  ributes_count; a
12340 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
12350 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64  .curr_attr = &id
12360 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
12370 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72  .attributes[attr
12380 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28  _idx];......if (
12390 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
123a0 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  e) {......free(c
123b0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
123c0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
123d0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
123e0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
123f0 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28  tes) {.....free(
12400 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
12410 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a  x].attributes);.
12420 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
12430 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74  free_certs(ident
12440 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
12450 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20  sc_identity, 1, 
12460 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65  1);...}..}...fre
12470 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d  e(identities);.}
12480 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
12490 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
124a0 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65  *cackey_read_ide
124b0 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
124c0 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
124d0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
124e0 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73  *ids_found) {..s
124f0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
12500 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
12510 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74  _identities;..st
12520 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
12530 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
12540 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
12550 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78   num_ids, id_idx
12560 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a  , curr_id_type;.
12570 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
12580 75 6d 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69  um_certs, cert_i
12590 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
125a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
125b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f  d.");...if (ids_
125c0 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  found == NULL) {
125d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
125e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
125f0 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c  ids_found is NUL
12600 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  L");....return(N
12610 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f  ULL);..}...pcsc_
12620 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
12630 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73  key_read_certs(s
12640 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f  lot, NULL, &num_
12650 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73  certs);..if (pcs
12660 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
12670 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e  NULL) {.../* Con
12680 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43  vert number of C
12690 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f  erts to number o
126a0 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e  f objects */...n
126b0 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52  um_ids = (CKO_PR
126c0 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f  IVATE_KEY - CKO_
126d0 43 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 29  CERTIFICATE + 1)
126e0 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09   * num_certs;...
126f0 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61  .identities = ma
12700 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73  lloc(num_ids * s
12710 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
12720 73 29 29 3b 0a 0a 09 09 69 64 5f 69 64 78 20 3d  s));....id_idx =
12730 20 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f   0;...for (cert_
12740 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64  idx = 0; cert_id
12750 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63  x < num_certs; c
12760 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ert_idx++) {....
12770 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70  for (curr_id_typ
12780 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  e = CKO_CERTIFIC
12790 41 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  ATE; curr_id_typ
127a0 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  e <= CKO_PRIVATE
127b0 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79  _KEY; curr_id_ty
127c0 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e  pe++) {.....iden
127d0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
127e0 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
127f0 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
12800 73 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20  s(curr_id_type, 
12810 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  &pcsc_identities
12820 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74  [cert_idx], cert
12830 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65  _idx, &identitie
12840 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
12850 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  utes_count);....
12860 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
12870 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
12880 74 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tes == NULL) {..
12890 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
128a0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
128b0 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  s_count = 0;....
128c0 09 7d 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69  .}......identiti
128d0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
128e0 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  identity = mallo
128f0 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  c(sizeof(*identi
12900 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
12910 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09  c_identity));...
12920 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74  ..memcpy(identit
12930 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
12940 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63  _identity, &pcsc
12950 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
12960 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69  _idx], sizeof(*i
12970 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
12980 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29  ].pcsc_identity)
12990 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69  );......identiti
129a0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
129b0 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
129c0 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70  icate = malloc(p
129d0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
129e0 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69  ert_idx].certifi
129f0 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d  cate_len);.....m
12a00 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73  emcpy(identities
12a10 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
12a20 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
12a30 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69  ate, pcsc_identi
12a40 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
12a50 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63  ertificate, pcsc
12a60 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
12a70 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
12a80 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f  e_len);......id_
12a90 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  idx++;....}...}.
12aa0 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
12ab0 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
12ac0 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
12ad0 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75   1);....*ids_fou
12ae0 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 09 09  nd = num_ids;...
12af0 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65  return(identitie
12b00 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f  s);..}...*ids_fo
12b10 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  und = 0;..return
12b20 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  (NULL);.}..CK_DE
12b30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
12b40 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a  _RV, C_Initializ
12b50 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
12b60 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f  InitArgs) {..CK_
12b70 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
12b80 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09  S CK_PTR args;..
12b90 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69  uint32_t idx;..i
12ba0 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  nt mutex_init_re
12bb0 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
12bc0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
12bd0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 69 74  .");...if (pInit
12be0 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Args != NULL) {.
12bf0 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72  ..args = pInitAr
12c00 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61  gs;...memcpy(&ca
12c10 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c  ckey_args, args,
12c20 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61   sizeof(cackey_a
12c30 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72  rgs));....if (ar
12c40 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20  gs->CreateMutex 
12c50 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
12c60 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d  >DestroyMutex ==
12c70 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c   NULL || args->L
12c80 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
12c90 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b   || args->Unlock
12ca0 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Mutex == NULL) {
12cb0 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
12cc0 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c  eateMutex != NUL
12cd0 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
12ce0 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  oyMutex != NULL 
12cf0 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
12d00 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
12d10 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
12d20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43  != NULL) {.....C
12d30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12d40 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c  TF("Error. Some,
12d50 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72   but not All thr
12d60 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65  eading primitive
12d70 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a  s provided.");..
12d80 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
12d90 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
12da0 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 61  ..}...}....if (a
12db0 72 67 73 2d 3e 70 52 65 73 65 72 76 65 64 20 21  rgs->pReserved !
12dc0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43  = NULL) {....CAC
12dd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12de0 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
12df0 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
12e00 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
12e10 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
12e20 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
12e30 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  ..cackey_args.Cr
12e40 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  eateMutex = NULL
12e50 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
12e60 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e  DestroyMutex = N
12e70 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
12e80 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e  gs.LockMutex = N
12e90 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
12ea0 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d  gs.UnlockMutex =
12eb0 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
12ec0 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a  args.flags = 0;.
12ed0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
12ee0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
12ef0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12f00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c  INTF("Error.  Al
12f10 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65  ready initialize
12f20 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
12f30 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52  CKR_CRYPTOKI_ALR
12f40 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44  EADY_INITIALIZED
12f50 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
12f60 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
12f70 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
12f80 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
12f90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
12fa0 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
12fb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
12fc0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
12fd0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
12fe0 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
12ff0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
13000 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
13010 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  lots[0])); idx++
13020 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ) {...cackey_slo
13030 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ts[idx].active =
13040 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
13050 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
13060 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  der = NULL;...ca
13070 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
13080 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
13090 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  h = 0;...cackey_
130a0 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f  slots[idx].slot_
130b0 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63  reset = 0;...cac
130c0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
130d0 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
130e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
130f0 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  dx].label = NULL
13100 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e  ;..}...cackey_in
13110 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a  itialized = 1;..
13120 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67  .if (!cackey_big
13130 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d  lock_init) {...m
13140 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20  utex_init_ret = 
13150 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65  cackey_mutex_cre
13160 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c  ate(&cackey_bigl
13170 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74  ock);....if (mut
13180 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30  ex_init_ret != 0
13190 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
131a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
131b0 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61  r.  Mutex initia
131c0 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e  lization failed.
131d0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
131e0 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09  KR_CANT_LOCK);..
131f0 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67  .}....cackey_big
13200 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09  lock_init = 1;..
13210 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
13220 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
13230 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
13240 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
13250 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
13260 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
13270 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c  N(CK_RV, C_Final
13280 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52  ize)(CK_VOID_PTR
13290 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75   pReserved) {..u
132a0 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43  int32_t idx;...C
132b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
132c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
132d0 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21  .if (pReserved !
132e0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
132f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13300 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65  "Error. pReserve
13310 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  d is not NULL.")
13320 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
13330 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
13340 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
13350 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
13360 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13370 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
13380 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
13390 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
133a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
133b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
133c0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
133d0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
133e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
133f0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
13400 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
13410 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
13420 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
13430 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f  .active) {....C_
13440 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78  CloseSession(idx
13450 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b  );...}..}...cack
13460 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
13470 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72  ect_all();...for
13480 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
13490 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
134a0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
134b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
134c0 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
134d0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
134e0 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  dx].pcsc_reader)
134f0 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
13500 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
13510 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a 09  c_reader);...}..
13520 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  }...cackey_pcsc_
13530 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09  disconnect();...
13540 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
13550 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59  ed = 0;...CACKEY
13560 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13570 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
13580 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
13590 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
135a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
135b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
135c0 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e 46  _GetInfo)(CK_INF
135d0 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
135e0 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
135f0 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49  AR manufacturerI
13600 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65  D[] = "U.S. Gove
13610 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63  rnment";..static
13620 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69 62   CK_UTF8CHAR lib
13630 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 5b  raryDescription[
13640 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a 09  ] = "CACKey";...
13650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13660 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
13670 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
13680 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
13690 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
136a0 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
136b0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
136c0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
136d0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
136e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
136f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
13700 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13710 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
13720 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
13730 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
13740 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
13750 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 79  ..}...pInfo->cry
13760 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a  ptokiVersion.maj
13770 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
13780 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
13790 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78  ODE) >> 16) & 0x
137a0 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70  ff;..pInfo->cryp
137b0 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  tokiVersion.mino
137c0 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
137d0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
137e0 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  DE) >> 8) & 0xff
137f0 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
13800 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
13810 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
13820 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
13830 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  rID));..memcpy(p
13840 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
13850 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72  erID, manufactur
13860 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e  erID, sizeof(man
13870 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31  ufacturerID) - 1
13880 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  );...pInfo->flag
13890 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d 73  s = 0x00;...mems
138a0 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  et(pInfo->librar
138b0 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20  yDescription, ' 
138c0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
138d0 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
138e0 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  ion));..memcpy(p
138f0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
13900 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61 72  cription, librar
13910 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  yDescription, si
13920 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73 63  zeof(libraryDesc
13930 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a  ription) - 1);..
13940 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56  .pInfo->libraryV
13950 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
13960 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
13970 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
13980 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  f;..pInfo->libra
13990 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  ryVersion.minor 
139a0 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
139b0 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30  sion() >> 8) & 0
139c0 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  xff;...CACKEY_DE
139d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
139e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
139f0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
13a00 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
13a10 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73 20  ../*. * Process 
13a20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 2c  list of readers,
13a30 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70 70   and create mapp
13a40 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61 64  ing between read
13a50 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f 74  er name and slot
13a60 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e   ID. */.CK_DEFIN
13a70 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
13a80 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29  , C_GetSlotList)
13a90 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50  (CK_BBOOL tokenP
13aa0 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f  resent, CK_SLOT_
13ab0 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73 74  ID_PTR pSlotList
13ac0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
13ad0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74 20  ulCount) {..int 
13ae0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
13af0 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  nt pcsc_connect_
13b00 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63  ret;..CK_ULONG c
13b10 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74  ount, slot_count
13b20 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 3b 0a   = 0, currslot;.
13b30 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64  .char *pcsc_read
13b40 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65  ers, *pcsc_reade
13b50 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 64  rs_s, *pcsc_read
13b60 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 63  ers_e;..DWORD pc
13b70 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a  sc_readers_len;.
13b80 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74  .LONG scard_list
13b90 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69  readers_ret;..si
13ba0 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72  ze_t curr_reader
13bb0 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _len;...CACKEY_D
13bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
13bd0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75  led.");...if (pu
13be0 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
13bf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13c00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
13c10 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  pulCount is NULL
13c20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
13c30 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
13c40 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
13c50 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
13c60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13c70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13c80 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
13c90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
13ca0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
13cb0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
13cc0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
13cd0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
13ce0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
13cf0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
13d00 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
13d10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13d20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
13d30 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
13d40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
13d50 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
13d60 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69  .}.../* Clear li
13d70 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09  st of slots */..
13d80 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b  if (pSlotList) {
13d90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13da0 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20  PRINTF("Purging 
13db0 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61  all slot informa
13dc0 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 2f 2a 20 4f  tion.");..../* O
13dd0 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c  nly update the l
13de0 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20  ist of slots if 
13df0 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  we are actually 
13e00 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65  being supply the
13e10 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f   slot informatio
13e20 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73 6c  n */...cackey_sl
13e30 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
13e40 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63 75  ll();....for (cu
13e50 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72  rrslot = 0; curr
13e60 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
13e70 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
13e80 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
13e90 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
13ea0 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61  t++) {....if (ca
13eb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
13ec0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
13ed0 29 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63  ) {.....free(cac
13ee0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
13ef0 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
13f00 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  ;......cackey_sl
13f10 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
13f20 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c  sc_reader = NULL
13f30 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63  ;....}.....if (c
13f40 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
13f50 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09  slot].label) {..
13f60 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
13f70 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
13f80 61 62 65 6c 29 3b 0a 0a 09 09 09 09 63 61 63 6b  abel);......cack
13f90 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
13fa0 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  t].label = NULL;
13fb0 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
13fc0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
13fd0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d  .active = 0;...}
13fe0 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
13ff0 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65  ne list of reade
14000 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e  rs */..pcsc_conn
14010 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
14020 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b  _pcsc_connect();
14030 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
14040 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
14050 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
14060 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14070 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
14080 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c  to PC/SC failed,
14090 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f   assuming no slo
140a0 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f  ts");....slot_co
140b0 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65  unt = 0;..} else
140c0 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72   {...pcsc_reader
140d0 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63  s_len = 0;....sc
140e0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
140f0 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52  ret = SCardListR
14100 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70  eaders(*cackey_p
14110 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c  csc_handle, NULL
14120 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65  , NULL, &pcsc_re
14130 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 66  aders_len);...if
14140 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
14150 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
14160 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20 70 63  _S_SUCCESS && pc
14170 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21  sc_readers_len !
14180 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72  = 0) {....pcsc_r
14190 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28  eaders = malloc(
141a0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
141b0 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65  );....pcsc_reade
141c0 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_s = pcsc_read
141d0 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c  ers;.....scard_l
141e0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
141f0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
14200 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
14210 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73  andle, NULL, pcs
14220 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73 63  c_readers, &pcsc
14230 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
14240 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
14250 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
14260 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
14270 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  {.....pcsc_reade
14280 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_e = pcsc_read
14290 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65  ers + pcsc_reade
142a0 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 63 75 72  rs_len;......cur
142b0 72 73 6c 6f 74 20 3d 20 30 3b 0a 09 09 09 09 77  rslot = 0;.....w
142c0 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65  hile (pcsc_reade
142d0 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72  rs < pcsc_reader
142e0 73 5f 65 29 20 7b 0a 09 09 09 09 09 63 75 72 72  s_e) {......curr
142f0 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74  _reader_len = st
14300 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72  rlen(pcsc_reader
14310 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70  s);.......if ((p
14320 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75  csc_readers + cu
14330 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e  rr_reader_len) >
14340 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29   pcsc_readers_e)
14350 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
14360 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
14370 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e  (curr_reader_len
14380 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62   == 0) {.......b
14390 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
143a0 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20  ...if (currslot 
143b0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
143c0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
143d0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
143e0 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ]))) {.......CAC
143f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14400 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61  ("Found more rea
14410 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20  ders than slots 
14420 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29  are available!")
14430 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
14440 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43  .....}.......CAC
14450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14460 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20  ("Found reader: 
14470 25 73 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72  %s", pcsc_reader
14480 73 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c  s);......./* Onl
14490 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73  y update the lis
144a0 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65  t of slots if we
144b0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65   are actually be
144c0 69 6e 67 20 61 73 6b 65 64 20 73 75 70 70 6c 79  ing asked supply
144d0 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   the slot inform
144e0 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66  ation */......if
144f0 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09   (pSlotList) {..
14500 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
14510 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
14520 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 63 61  ve = 1;.......ca
14530 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
14540 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
14550 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72   = strdup(pcsc_r
14560 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 63  eaders);.......c
14570 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
14580 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f  slot].pcsc_card_
14590 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
145a0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
145b0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e  s[currslot].tran
145c0 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
145d0 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  0;.......cackey_
145e0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
145f0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
14600 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
14610 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b  ts[currslot].tok
14620 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
14630 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09  OGIN_REQUIRED;..
14640 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
14650 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
14660 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  l = NULL;......}
14670 0a 09 09 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b  ......currslot++
14680 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f 72 65 61  ;.......pcsc_rea
14690 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61  ders += curr_rea
146a0 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09  der_len + 1;....
146b0 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72  .}......if (curr
146c0 73 6c 6f 74 20 3e 20 30 29 20 7b 0a 09 09 09 09  slot > 0) {.....
146d0 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75  .slot_count = cu
146e0 72 72 73 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09  rrslot;.....}...
146f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41  .} else {.....CA
14700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14710 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74  F("Second call t
14720 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
14730 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
14740 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
14750 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
14760 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
14770 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
14780 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
14790 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
147a0 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65  t);....}.....fre
147b0 65 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73  e(pcsc_readers_s
147c0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
147d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
147e0 49 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c  INTF("First call
147f0 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61   to SCardListRea
14800 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74  ders failed, ret
14810 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43  urn %s/%li", CAC
14820 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
14830 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
14840 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
14850 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
14860 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
14870 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ret);...}..}...m
14880 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
14890 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
148a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
148b0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
148c0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
148d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
148e0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
148f0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
14900 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
14910 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
14920 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  }...if (pSlotLis
14930 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a  t == NULL) {...*
14940 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f  pulCount = slot_
14950 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59  count;....CACKEY
14960 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14970 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
14980 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
14990 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
149a0 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20  );..}...count = 
149b0 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28  *pulCount;..if (
149c0 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75  count < slot_cou
149d0 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  nt) {...CACKEY_D
149e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
149f0 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74  or. User allocat
14a00 65 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20  ed %lu entries, 
14a10 62 75 74 20 77 65 20 68 61 76 65 20 25 6c 75 20  but we have %lu 
14a20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74  entries.", count
14a30 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a  , slot_count);..
14a40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46  ..return(CKR_BUF
14a50 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09  FER_TOO_SMALL);.
14a60 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 73  ..}...for (currs
14a70 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
14a80 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20  t < slot_count; 
14a90 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
14aa0 70 53 6c 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c  pSlotList[currsl
14ab0 6f 74 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a  ot] = currslot;.
14ac0 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  .}...*pulCount =
14ad0 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43   slot_count;...C
14ae0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14af0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
14b00 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e  R_OK (%i).  Foun
14b10 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c  d %lu readers.",
14b20 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e   CKR_OK, (unsign
14b30 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f  ed long) slot_co
14b40 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  unt);...return(C
14b50 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50  KR_OK);...tokenP
14b60 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72  resent = tokenPr
14b70 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73  esent; /* Supres
14b80 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
14b90 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
14ba0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
14bb0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53  ON(CK_RV, C_GetS
14bc0 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54  lotInfo)(CK_SLOT
14bd0 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53  _ID slotID, CK_S
14be0 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  LOT_INFO_PTR pIn
14bf0 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
14c00 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65  _UTF8CHAR slotDe
14c10 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43  scription[] = "C
14c20 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e  ACKey Slot";..in
14c30 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
14c40 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f  .int bytes_to_co
14c50 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  py;...CACKEY_DEB
14c60 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
14c70 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
14c80 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
14c90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14ca0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
14cb0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
14cc0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
14cd0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
14ce0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
14cf0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
14d00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14d10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
14d20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
14d30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
14d40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
14d50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
14d60 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
14d70 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
14d80 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
14d90 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
14da0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
14db0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14dc0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
14dd0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
14de0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
14df0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
14e00 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
14e10 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
14e20 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
14e30 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
14e40 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
14e50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
14e60 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
14e70 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
14e80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14e90 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
14ea0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
14eb0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
14ec0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
14ed0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
14ee0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
14ef0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
14f00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
14f10 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
14f20 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
14f30 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
14f40 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
14f50 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
14f60 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
14f70 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
14f80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
14f90 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
14fa0 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  ..}...pInfo->fla
14fb0 67 73 20 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42  gs = CKF_REMOVAB
14fc0 4c 45 5f 44 45 56 49 43 45 20 7c 20 43 4b 46 5f  LE_DEVICE | CKF_
14fd0 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 63  HW_SLOT;...if (c
14fe0 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
14ff0 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ent(&cackey_slot
15000 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41  s[slotID]) == CA
15010 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
15020 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 70 49  NPRESENT) {...pI
15030 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b  nfo->flags |= CK
15040 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b  F_TOKEN_PRESENT;
15050 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63  ..}...bytes_to_c
15060 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63  opy = strlen(cac
15070 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
15080 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ].pcsc_reader);.
15090 09 69 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66  .if (sizeof(pInf
150a0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
150b0 44 29 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f  D) < bytes_to_co
150c0 70 79 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f  py) {...bytes_to
150d0 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70  _copy = sizeof(p
150e0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
150f0 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70  erID);..}..memcp
15100 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  y(pInfo->manufac
15110 74 75 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f  turerID, cackey_
15120 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63  slots[slotID].pc
15130 73 63 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73  sc_reader, bytes
15140 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74  _to_copy);...mut
15150 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
15160 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
15170 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
15180 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
15190 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
151a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
151b0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
151c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
151d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
151e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
151f0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
15200 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c  slotDescription,
15210 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
15220 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
15230 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  ion));..memcpy(p
15240 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
15250 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72  ption, slotDescr
15260 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73  iption, sizeof(s
15270 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20  lotDescription) 
15280 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
15290 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
152a0 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
152b0 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
152c0 74 75 72 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e  turerID));...pIn
152d0 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
152e0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63  ion.major = (cac
152f0 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
15300 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
15310 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
15320 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
15330 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
15340 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66  on() >> 8) & 0xf
15350 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d  f;...pInfo->firm
15360 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
15370 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f  r = 0x00;..pInfo
15380 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
15390 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a  n.minor = 0x00;.
153a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
153b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
153c0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
153d0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
153e0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
153f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
15400 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65  CK_RV, C_GetToke
15410 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  nInfo)(CK_SLOT_I
15420 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b  D slotID, CK_TOK
15430 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  EN_INFO_PTR pInf
15440 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
15450 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63  UTF8CHAR manufac
15460 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53  turerID[] = "U.S
15470 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09  . Government";..
15480 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
15490 41 52 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b  AR defaultLabel[
154a0 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b  ] = "Unknown Tok
154b0 65 6e 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  en";..static CK_
154c0 55 54 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d  UTF8CHAR model[]
154d0 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a   = "CAC Token";.
154e0 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
154f0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
15500 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  sc_identities;..
15510 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
15520 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f  m_certs;..ssize_
15530 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e  t label_ret;..in
15540 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
15550 09 69 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74  .int use_default
15560 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59  _label;...CACKEY
15570 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
15580 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
15590 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pInfo == NULL) {
155a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
155b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
155c0 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  Info is NULL.");
155d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
155e0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
155f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
15600 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
15610 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15620 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
15630 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
15640 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
15650 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
15660 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
15670 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
15680 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
15690 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
156a0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
156b0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
156c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
156d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
156e0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
156f0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
15700 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
15710 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
15720 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
15730 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
15740 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
15750 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
15760 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
15770 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
15780 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
15790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
157a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
157b0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
157c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
157d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
157e0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
157f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
15800 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
15810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15820 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
15830 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
15840 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
15850 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
15860 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
15870 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
15880 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
15890 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
158a0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
158b0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
158c0 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
158d0 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  nt(&cackey_slots
158e0 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43  [slotID]) != CAC
158f0 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
15900 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43  PRESENT) {...CAC
15910 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15920 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72  ("No token is pr
15930 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20  esent in slotID 
15940 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b  = %lu", slotID);
15950 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
15960 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
15970 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
15980 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54  rn(CKR_TOKEN_NOT
15990 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  _PRESENT);..}...
159a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
159b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
159c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
159d0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
159e0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
159f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15a00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
15a10 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
15a20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
15a30 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
15a40 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
15a50 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72  e token label fr
15a60 6f 6d 20 63 65 72 74 69 66 69 63 61 74 65 73 20  om certificates 
15a70 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  */..memset(pInfo
15a80 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69  ->label, ' ', si
15a90 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
15aa0 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c  l));..use_defaul
15ab0 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69  t_label = 1;...i
15ac0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
15ad0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d  slotID].label ==
15ae0 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f   NULL) {...pcsc_
15af0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
15b00 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26  key_read_certs(&
15b10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
15b20 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  tID], NULL, &num
15b30 5f 63 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70  _certs);...if (p
15b40 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21  csc_identities !
15b50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20  = NULL) {....if 
15b60 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20  (num_certs > 0) 
15b70 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20  {.....label_ret 
15b80 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  = cackey_pcsc_id
15b90 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28  entity_to_label(
15ba0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c  pcsc_identities,
15bb0 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73   pInfo->label, s
15bc0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
15bd0 65 6c 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61  el));.....if (la
15be0 62 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09  bel_ret > 0) {..
15bf0 09 09 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  ....use_default_
15c00 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09  label = 0;......
15c10 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
15c20 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61  otID].label = ma
15c30 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66  lloc(sizeof(pInf
15c40 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09  o->label));.....
15c50 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f  ..memcpy(cackey_
15c60 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
15c70 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65  bel, pInfo->labe
15c80 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  l, sizeof(pInfo-
15c90 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a  >label));.....}.
15ca0 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
15cb0 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f  free_certs(pcsc_
15cc0 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
15cd0 63 65 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09  certs, 1);...}..
15ce0 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70  } else {...memcp
15cf0 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  y(pInfo->label, 
15d00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
15d10 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65  tID].label, size
15d20 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
15d30 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c  );....use_defaul
15d40 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a  t_label = 0;..}.
15d50 0a 09 69 66 20 28 75 73 65 5f 64 65 66 61 75 6c  ..if (use_defaul
15d60 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d  t_label) {...mem
15d70 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  cpy(pInfo->label
15d80 2c 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20  , defaultLabel, 
15d90 73 69 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c 61  sizeof(defaultLa
15da0 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09  bel) - 1);..}...
15db0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
15dc0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
15dd0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
15de0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
15df0 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
15e00 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
15e10 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  , manufacturerID
15e20 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63  , sizeof(manufac
15e30 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a  turerID) - 1);..
15e40 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
15e50 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f  odel, ' ', sizeo
15e60 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29  f(pInfo->model))
15e70 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
15e80 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73  >model, model, s
15e90 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31  izeof(model) - 1
15ea0 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  );...memset(pInf
15eb0 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c  o->serialNumber,
15ec0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
15ed0 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72  fo->serialNumber
15ee0 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ));...memset(pIn
15ef0 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27  fo->utcTime, ' '
15f00 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
15f10 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e  utcTime));...pIn
15f20 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
15f30 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63  ion.major = (cac
15f40 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
15f50 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
15f60 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
15f70 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
15f80 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
15f90 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66  on() >> 8) & 0xf
15fa0 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d  f;...pInfo->firm
15fb0 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
15fc0 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f  r = 0x00;..pInfo
15fd0 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
15fe0 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a  n.minor = 0x00;.
15ff0 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
16000 20 43 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45   CKF_WRITE_PROTE
16010 43 54 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f  CTED | CKF_USER_
16020 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20  PIN_INITIALIZED 
16030 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54  | CKF_TOKEN_INIT
16040 49 41 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65 79  IALIZED | cackey
16050 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
16060 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 70 49  oken_flags;...pI
16070 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f  nfo->ulMaxSessio
16080 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66  nCount = (sizeof
16090 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
160a0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
160b0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20  y_sessions[0])) 
160c0 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53  - 1;..pInfo->ulS
160d0 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b  essionCount = CK
160e0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
160f0 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
16100 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e  ->ulMaxRwSession
16110 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66  Count = 0;..pInf
16120 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f  o->ulRwSessionCo
16130 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  unt = CK_UNAVAIL
16140 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
16150 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50  ;..pInfo->ulMaxP
16160 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49  inLen = 128;..pI
16170 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e  nfo->ulMinPinLen
16180 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   = 0;..pInfo->ul
16190 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72  TotalPublicMemor
161a0 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
161b0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
161c0 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75  .pInfo->ulFreePu
161d0 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  blicMemory = CK_
161e0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
161f0 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
16200 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d  >ulTotalPrivateM
16210 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
16220 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
16230 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72  ON;..pInfo->ulFr
16240 65 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20  eePrivateMemory 
16250 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
16260 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09  _INFORMATION;...
16270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16280 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
16290 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
162a0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
162b0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
162c0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
162d0 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c  _RV, C_WaitForSl
162e0 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47  otEvent)(CK_FLAG
162f0 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54  S flags, CK_SLOT
16300 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c  _ID_PTR pSlotID,
16310 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65   CK_VOID_PTR pRe
16320 73 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45  served) {..CACKE
16330 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16340 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
16350 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
16360 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
16370 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16380 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
16390 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
163a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
163b0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
163c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
163d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
163e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
163f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
16400 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
16410 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
16420 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
16430 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
16440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16450 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
16460 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
16470 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
16480 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
16490 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
164a0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
164b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
164c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
164d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
164e0 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
164f0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
16500 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  tID, CK_MECHANIS
16510 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68  M_TYPE_PTR pMech
16520 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c  anismList, CK_UL
16530 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
16540 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
16550 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
16560 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
16570 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
16580 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16590 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
165a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
165b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
165c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
165d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
165e0 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20  ...if (pulCount 
165f0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
16600 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16610 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75  ("Error.  pulCou
16620 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
16630 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
16640 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
16650 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
16660 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
16670 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 33 3b  ..*pulCount = 3;
16680 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16690 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
166a0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
166b0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
166c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
166d0 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20  ..if (*pulCount 
166e0 3c 20 33 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 3) {...CACKEY_
166f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16700 72 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f  ror.  Buffer too
16710 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65   small.");....re
16720 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f  turn(CKR_BUFFER_
16730 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a  TOO_SMALL);..}..
16740 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b  .pMechanismList[
16750 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  0] = CKM_RSA_PKC
16760 53 3b 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69  S;..pMechanismLi
16770 73 74 5b 31 5d 20 3d 20 43 4b 4d 5f 53 48 41 31  st[1] = CKM_SHA1
16780 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c  _RSA_PKCS;..*pul
16790 43 6f 75 6e 74 20 3d 20 32 3b 0a 0a 09 43 41 43  Count = 2;...CAC
167a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
167b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
167c0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
167d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
167e0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
167f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
16800 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  , C_GetMechanism
16810 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
16820 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48   slotID, CK_MECH
16830 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c  ANISM_TYPE type,
16840 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e   CK_MECHANISM_IN
16850 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
16860 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
16870 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
16880 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
16890 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
168a0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
168b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
168c0 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
168d0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
168e0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
168f0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
16900 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
16910 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
16920 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16930 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
16940 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
16950 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
16960 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
16970 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
16980 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
16990 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
169a0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
169b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
169c0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
169d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
169e0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
169f0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
16a00 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
16a10 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
16a20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
16a30 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
16a40 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
16a50 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
16a60 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
16a70 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
16a80 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
16a90 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
16aa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16ab0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
16ac0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
16ad0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
16ae0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
16af0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
16b00 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
16b10 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
16b20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16b30 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
16b40 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
16b50 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
16b60 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
16b70 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
16b80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
16b90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
16ba0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
16bb0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
16bc0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
16bd0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
16be0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
16bf0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
16c00 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
16c10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16c20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16c30 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
16c40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
16c50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
16c60 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58  OR);..}.../* XXX
16c70 3a 20 54 68 69 73 20 69 73 20 75 6e 74 65 73 74  : This is untest
16c80 65 64 2c 20 61 6e 64 20 66 75 72 74 68 65 72 20  ed, and further 
16c90 49 27 6d 20 6e 6f 74 20 72 65 61 6c 6c 79 20 73  I'm not really s
16ca0 75 72 65 20 69 66 20 74 68 69 73 20 69 73 20 63  ure if this is c
16cb0 6f 72 72 65 63 74 2e 20 2a 2f 0a 09 73 77 69 74  orrect. */..swit
16cc0 63 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61  ch (type) {...ca
16cd0 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
16ce0 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e  ....pInfo->ulMin
16cf0 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09  KeySize = 512;..
16d00 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65  ..pInfo->ulMaxKe
16d10 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09  ySize = 8192;...
16d20 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
16d30 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43  CKF_HW | CKF_ENC
16d40 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59  RYPT | CKF_DECRY
16d50 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20  PT | CKF_SIGN | 
16d60 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62  CKF_VERIFY;....b
16d70 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d  reak;...case CKM
16d80 5f 52 53 41 5f 58 5f 35 30 39 3a 0a 09 09 09 70  _RSA_X_509:....p
16d90 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69  Info->ulMinKeySi
16da0 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e  ze = 512;....pIn
16db0 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65  fo->ulMaxKeySize
16dc0 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66   = 8192;....pInf
16dd0 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48  o->flags = CKF_H
16de0 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20  W | CKF_ENCRYPT 
16df0 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20  | CKF_DECRYPT | 
16e00 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56  CKF_SIGN | CKF_V
16e10 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b  ERIFY;....break;
16e20 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31  ...case CKM_SHA1
16e30 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49  _RSA_PKCS:....pI
16e40 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a  nfo->ulMinKeySiz
16e50 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66  e = 512;....pInf
16e60 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20  o->ulMaxKeySize 
16e70 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f  = 8192;....pInfo
16e80 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57  ->flags = CKF_HW
16e90 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b   | CKF_SIGN | CK
16ea0 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65  F_VERIFY;....bre
16eb0 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ak;..}...CACKEY_
16ec0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
16ed0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
16ee0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
16ef0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
16f00 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
16f10 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
16f20 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
16f30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
16f40 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43  , C_InitToken)(C
16f50 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
16f60 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
16f70 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
16f80 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54   ulPinLen, CK_UT
16f90 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65  F8CHAR_PTR pLabe
16fa0 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  l) {..CACKEY_DEB
16fb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
16fc0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
16fd0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
16fe0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16ff0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
17000 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
17010 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
17020 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
17030 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
17040 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
17050 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
17060 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ng CKR_TOKEN_WRI
17070 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69  TE_PROTECTED (%i
17080 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  )", CKR_TOKEN_WR
17090 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
170a0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
170b0 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
170c0 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f  ED);.}../* We do
170d0 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73  n't support this
170e0 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44   method. */.CK_D
170f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
17100 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29  K_RV, C_InitPIN)
17110 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
17120 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
17130 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
17140 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
17150 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nLen) {..CACKEY_
17160 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
17170 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
17180 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
17190 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
171a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
171b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
171c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
171d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
171e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
171f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
17200 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
17210 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f  rning CKR_TOKEN_
17220 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20  WRITE_PROTECTED 
17230 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e  (%i)", CKR_TOKEN
17240 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
17250 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
17260 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
17270 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65  ECTED);.}../* We
17280 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74   don't support t
17290 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43  his method. */.C
172a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
172b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49  N(CK_RV, C_SetPI
172c0 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  N)(CK_SESSION_HA
172d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
172e0 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
172f0 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  OldPin, CK_ULONG
17300 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b   ulOldPinLen, CK
17310 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e  _UTF8CHAR_PTR pN
17320 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ewPin, CK_ULONG 
17330 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09  ulNewPinLen) {..
17340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17350 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
17360 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
17370 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
17380 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17390 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
173a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
173b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
173c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
173d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
173e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
173f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
17400 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
17410 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
17420 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
17430 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
17440 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
17450 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
17460 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
17470 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
17480 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b  _OpenSession)(CK
17490 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
174a0 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c   CK_FLAGS flags,
174b0 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70   CK_VOID_PTR pAp
174c0 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f  plication, CK_NO
174d0 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f  TIFY notify, CK_
174e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50  SESSION_HANDLE_P
174f0 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a  TR phSession) {.
17500 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
17510 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
17520 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e  etval;..int foun
17530 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a  d_session = 0;..
17540 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17550 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
17560 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26 20  ...if ((flags & 
17570 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49  CKF_SERIAL_SESSI
17580 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41  ON) != CKF_SERIA
17590 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72  L_SESSION) {...r
175a0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
175b0 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53  N_PARALLEL_NOT_S
175c0 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09  UPPORTED);..}...
175d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
175e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
175f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17600 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
17610 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
17620 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
17630 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
17640 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
17650 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
17660 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
17670 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
17680 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
17690 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
176a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
176b0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
176c0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
176d0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
176e0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
176f0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
17700 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
17710 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
17720 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
17730 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
17740 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
17750 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
17760 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
17770 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17780 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
17790 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
177a0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
177b0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
177c0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
177d0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
177e0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
177f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17800 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
17810 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
17820 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
17830 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
17840 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
17850 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
17860 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
17870 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
17880 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
17890 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
178a0 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69 73  that the card is
178b0 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65   actually in the
178c0 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58   slot. */../* XX
178d0 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  X: Check to make
178e0 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69 6e   sure this is in
178f0 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70 65   the PKCS#11 spe
17900 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69  cification */..i
17910 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
17920 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
17930 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
17940 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
17950 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
17960 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17970 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43  RINTF("Error.  C
17980 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e  ard not present.
17990 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f    Returning CKR_
179a0 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29  DEVICE_REMOVED")
179b0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
179c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
179d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
179e0 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52  urn(CKR_DEVICE_R
179f0 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f  EMOVED);..}...fo
17a00 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20  r (idx = 1; idx 
17a10 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
17a20 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
17a30 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
17a40 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
17a50 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79   {...if (!cackey
17a60 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
17a70 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e  ctive) {....foun
17a80 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a  d_session = 1;..
17a90 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20  ...*phSession = 
17aa0 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  idx;.....cackey_
17ab0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
17ac0 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63  tive = 1;....cac
17ad0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
17ae0 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49  ].slotID = slotI
17af0 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  D;....cackey_ses
17b00 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65  sions[idx].state
17b10 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
17b20 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63  _SESSION;....cac
17b30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
17b40 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ].flags = flags;
17b50 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
17b60 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63  ons[idx].ulDevic
17b70 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63  eError = 0;....c
17b80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
17b90 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e  dx].pApplication
17ba0 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b   = pApplication;
17bb0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
17bc0 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20  ons[idx].Notify 
17bd0 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61  = notify;.....ca
17be0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
17bf0 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  x].identities = 
17c00 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f  NULL;....cackey_
17c10 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
17c20 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
17c30 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
17c40 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61  essions[idx].sea
17c50 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  rch_active = 0;.
17c60 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
17c70 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63  ons[idx].sign_ac
17c80 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
17c90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
17ca0 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  x].decrypt_activ
17cb0 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
17cc0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
17cd0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
17ce0 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
17cf0 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ies(&cackey_slot
17d00 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b  s[slotID], &cack
17d10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
17d20 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
17d30 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  t);......break;.
17d40 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
17d50 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
17d60 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
17d70 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
17d80 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
17d90 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
17da0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17db0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
17dc0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
17dd0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
17de0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
17df0 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e   (!found_session
17e00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17e10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
17e20 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e  ning CKR_SESSION
17e30 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b  _COUNT (%i)", CK
17e40 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
17e50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17e60 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
17e70 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
17e80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
17e90 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
17ea0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
17eb0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
17ec0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
17ed0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73  ON(CK_RV, C_Clos
17ee0 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53  eSession)(CK_SES
17ef0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
17f00 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  sion) {..int mut
17f10 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
17f20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17f30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
17f40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
17f50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
17f60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17f70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
17f80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
17f90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
17fa0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
17fb0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
17fc0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
17fd0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
17fe0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
17ff0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
18000 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
18010 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
18020 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18030 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
18040 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
18050 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
18060 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
18070 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
18080 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
18090 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
180a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
180b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
180c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
180d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
180e0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
180f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
18100 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
18110 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
18120 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
18130 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
18140 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
18150 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
18160 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
18170 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18180 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
18190 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
181a0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
181b0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
181c0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
181d0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
181e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
181f0 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f  ve = 0;..cackey_
18200 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28  free_identities(
18210 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18220 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
18230 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73  ties, cackey_ses
18240 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
18250 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
18260 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  );...mutex_retva
18270 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
18280 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
18290 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
182a0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
182b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
182c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
182d0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
182e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
182f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
18300 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
18310 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18320 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
18330 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
18340 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
18350 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
18360 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
18370 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
18380 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  s)(CK_SLOT_ID sl
18390 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f  otID) {..uint32_
183a0 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  t idx;..int mute
183b0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
183c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
183d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
183e0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
183f0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
18400 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18410 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
18420 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
18430 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
18440 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
18450 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
18460 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
18470 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
18480 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
18490 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
184a0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
184b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
184c0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
184d0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
184e0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
184f0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
18500 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
18510 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
18520 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
18530 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
18540 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
18550 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
18560 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
18570 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
18580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18590 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
185a0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
185b0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
185c0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
185d0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
185e0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
185f0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
18600 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18610 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
18620 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
18630 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
18640 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
18650 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
18660 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
18670 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
18680 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
18690 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
186a0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
186b0 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
186c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
186d0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
186e0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
186f0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
18700 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
18710 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
18720 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
18730 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44  ions[idx].slotID
18740 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09   != slotID) {...
18750 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
18760 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
18770 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
18780 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43  biglock);....C_C
18790 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29  loseSession(idx)
187a0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
187b0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
187c0 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  glock);...}..}..
187d0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
187e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
187f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
18800 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
18810 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
18820 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18830 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
18840 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
18850 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18860 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
18870 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
18880 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
18890 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
188a0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
188b0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
188c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
188d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
188e0 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f  SessionInfo)(CK_
188f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
18900 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53  Session, CK_SESS
18910 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  ION_INFO_PTR pIn
18920 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  fo) {..int mutex
18930 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
18940 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18950 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
18960 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
18970 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18980 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18990 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
189a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
189b0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
189c0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
189d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
189e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
189f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
18a00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
18a10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18a20 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
18a30 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
18a40 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
18a50 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
18a60 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
18a70 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
18a80 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
18a90 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
18aa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18ab0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
18ac0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
18ad0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
18ae0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
18af0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
18b00 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
18b10 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
18b20 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
18b30 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
18b40 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
18b50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18b60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
18b70 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
18b80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
18b90 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
18ba0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
18bb0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18bc0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
18bd0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
18be0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
18bf0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
18c00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18c10 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
18c20 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
18c30 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
18c40 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
18c50 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73  );..}...pInfo->s
18c60 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
18c70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18c80 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f  ].slotID;..pInfo
18c90 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79  ->state = cackey
18ca0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
18cb0 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66  on].state;..pInf
18cc0 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65  o->flags = cacke
18cd0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
18ce0 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e  ion].flags;..pIn
18cf0 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f  fo->ulDeviceErro
18d00 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  r = cackey_sessi
18d10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c  ons[hSession].ul
18d20 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d  DeviceError;...m
18d30 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
18d40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
18d50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
18d60 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
18d70 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
18d80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18d90 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
18da0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
18db0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
18dc0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
18dd0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
18de0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
18df0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
18e00 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
18e10 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
18e20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
18e30 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70  N(CK_RV, C_GetOp
18e40 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b  erationState)(CK
18e50 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
18e60 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
18e70 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e  E_PTR pOperation
18e80 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  State, CK_ULONG_
18e90 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e  PTR pulOperation
18ea0 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43  StateLen) {..CAC
18eb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18ec0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
18ed0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
18ee0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
18ef0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18f00 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
18f10 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
18f20 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
18f30 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
18f40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
18f50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18f60 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
18f70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
18f80 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
18f90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
18fa0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
18fb0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
18fc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
18fd0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
18fe0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
18ff0 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29  tOperationState)
19000 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
19010 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
19020 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74  BYTE_PTR pOperat
19030 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f  ionState, CK_ULO
19040 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  NG ulOperationSt
19050 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ateLen, CK_OBJEC
19060 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70  T_HANDLE hEncryp
19070 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  tionKey, CK_OBJE
19080 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65  CT_HANDLE hAuthe
19090 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a  nticationKey) {.
190a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
190b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
190c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
190d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
190e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
190f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
19100 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
19110 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
19120 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
19130 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
19140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19150 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
19160 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
19170 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
19180 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
19190 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
191a0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
191b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
191c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
191d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
191e0 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53  C_Login)(CK_SESS
191f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
19200 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50  ion, CK_USER_TYP
19210 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55  E userType, CK_U
19220 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
19230 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
19240 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Len) {..int mute
19250 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74  x_retval;..int t
19260 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
19270 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a  .int login_ret;.
19280 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19290 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
192a0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
192b0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
192c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
192d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
192e0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
192f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
19300 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
19310 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
19320 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
19330 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
19340 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
19350 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
19360 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
19370 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
19380 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19390 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
193a0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
193b0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
193c0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
193d0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
193e0 09 69 66 20 28 75 73 65 72 54 79 70 65 20 21 3d  .if (userType !=
193f0 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09 43   CKU_USER) {...C
19400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19410 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65 20 6f  TF("Error.  We o
19420 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53 45 52  nly support USER
19430 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f 72   mode, asked for
19440 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e   %lu mode.", (un
19450 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65  signed long) use
19460 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75 72 6e  rType)....return
19470 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f 49  (CKR_USER_TYPE_I
19480 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
19490 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
194a0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
194b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
194c0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
194d0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
194e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
194f0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
19500 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
19510 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
19520 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
19530 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
19540 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
19550 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
19560 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
19570 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
19580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19590 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
195a0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
195b0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
195c0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
195d0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
195e0 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20  }...login_ret = 
195f0 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61  cackey_login(&ca
19600 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65  ckey_slots[cacke
19610 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19620 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 70 50  ion].slotID], pP
19630 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74  in, ulPinLen, &t
19640 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b  ries_remaining);
19650 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20  ..if (login_ret 
19660 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
19670 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  _OK) {...cackey_
19680 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
19690 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
196a0 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d  .if (login_ret =
196b0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
196c0 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43  LOCKED) {....CAC
196d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
196e0 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20  ("Error.  Token 
196f0 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09  is locked.");...
19700 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
19710 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19720 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d  Session].slotID]
19730 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
19740 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
19750 4b 45 44 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  KED;.....return(
19760 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
19770 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f  ...} else if (lo
19780 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
19790 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
197a0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
197b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
197c0 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22  .  Invalid PIN."
197d0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
197e0 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69  ots[cackey_sessi
197f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
19800 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
19810 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
19820 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09  N_COUNT_LOW;....
19830 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
19840 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09  ning == 1) {....
19850 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61  .cackey_slots[ca
19860 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
19870 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2e  ession].slotID].
19880 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
19890 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41  KF_USER_PIN_FINA
198a0 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09  L_TRY;....}.....
198b0 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
198c0 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a  NCORRECT);...}..
198d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
198e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
198f0 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74  nknown error ret
19900 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65  urned from cacke
19910 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c  y_login() (%i)",
19920 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09   login_ret);....
19930 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
19940 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
19950 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63  cackey_slots[cac
19960 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19970 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2e 74  ssion].slotID].t
19980 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28  oken_flags &= ~(
19990 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
199a0 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50  KED | CKF_USER_P
199b0 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43  IN_COUNT_LOW | C
199c0 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
199d0 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e  D | CKF_USER_PIN
199e0 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63  _FINAL_TRY);...c
199f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19a00 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d  Session].state =
19a10 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e   CKS_RO_USER_FUN
19a20 43 54 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65 78 5f  CTIONS;...mutex_
19a30 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
19a40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
19a50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
19a60 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
19a70 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
19a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19a90 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
19aa0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
19ab0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
19ac0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
19ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19ae0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
19af0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
19b00 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
19b10 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
19b20 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
19b30 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b  RV, C_Logout)(CK
19b40 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
19b50 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74  hSession) {..int
19b60 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
19b70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19b80 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
19b90 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
19ba0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
19bb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19bc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
19bd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
19be0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
19bf0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
19c00 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
19c10 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
19c20 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
19c30 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
19c40 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
19c50 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
19c60 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
19c70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19c80 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
19c90 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
19ca0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
19cb0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
19cc0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
19cd0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
19ce0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
19cf0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
19d00 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
19d10 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
19d20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19d30 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
19d40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
19d50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
19d60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
19d70 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
19d80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
19d90 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
19da0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
19db0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19dc0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19dd0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19de0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
19df0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
19e00 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
19e10 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
19e20 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
19e30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
19e40 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50  state = CKS_RO_P
19e50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a  UBLIC_SESSION;..
19e60 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
19e70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
19e80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
19e90 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
19ea0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
19eb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19ec0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
19ed0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
19ee0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
19ef0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
19f00 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
19f10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
19f20 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
19f30 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
19f40 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
19f50 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
19f60 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65  ION(CK_RV, C_Cre
19f70 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  ateObject)(CK_SE
19f80 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
19f90 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
19fa0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
19fb0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
19fc0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
19fd0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
19fe0 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
19ff0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1a000 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1a010 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1a020 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a030 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a040 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1a050 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1a060 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1a070 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1a080 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1a090 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1a0a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1a0b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1a0c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1a0d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1a0e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1a0f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1a100 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1a110 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1a120 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65  K_RV, C_CopyObje
1a130 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
1a140 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1a150 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1a160 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
1a170 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
1a180 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
1a190 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
1a1a0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e  T_HANDLE_PTR phN
1a1b0 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  ewObject) {..CAC
1a1c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a1d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1a1e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1a1f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1a200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a210 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1a220 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1a230 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1a240 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1a250 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1a260 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a270 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1a280 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1a290 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1a2a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1a2b0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1a2c0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1a2d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1a2e0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1a2f0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
1a300 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f  stroyObject)(CK_
1a310 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1a320 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1a330 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
1a340 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
1a350 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1a360 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1a370 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1a380 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a390 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a3a0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1a3b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1a3c0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1a3d0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1a3e0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1a3f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1a400 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1a410 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1a420 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1a430 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1a440 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1a450 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1a460 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1a470 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1a480 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74  _RV, C_GetObject
1a490 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Size)(CK_SESSION
1a4a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1a4b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1a4c0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  LE hObject, CK_U
1a4d0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65  LONG_PTR pulSize
1a4e0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1a4f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1a500 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1a510 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1a520 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a530 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a540 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1a550 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1a560 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1a570 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1a580 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a590 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1a5a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1a5b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1a5c0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1a5d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1a5e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1a5f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1a600 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1a610 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1a620 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75  RV, C_GetAttribu
1a630 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
1a640 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1a650 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
1a660 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
1a670 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
1a680 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
1a690 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
1a6a0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
1a6b0 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74  rr_attr;..struct
1a6c0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1a6d0 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73   *identity;..uns
1a6e0 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
1a6f0 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64  ity_idx, attr_id
1a700 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
1a710 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20  , num_ids;..int 
1a720 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43  mutex_retval;..C
1a730 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
1a740 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  R_OK;..CK_VOID_P
1a750 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55  TR pValue;..CK_U
1a760 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  LONG ulValueLen;
1a770 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a780 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1a790 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1a7a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1a7b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a7c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1a7d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1a7e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a7f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1a800 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1a810 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1a820 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1a830 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1a840 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1a850 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1a860 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1a870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a880 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1a890 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1a8a0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1a8b0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1a8c0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1a8d0 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d  ..if (hObject ==
1a8e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1a8f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a900 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64  or.  Object hand
1a910 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
1a920 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1a930 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
1a940 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1a950 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20  .if (ulCount == 
1a960 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
1a970 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f  circuit, if zero
1a980 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70   objects were sp
1a990 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a  ecified return z
1a9a0 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69  ero items immedi
1a9b0 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45  ately */...CACKE
1a9c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a9d0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1a9e0 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
1a9f0 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
1aa00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1aa10 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  K);..}...if (pTe
1aa20 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  mplate == NULL) 
1aa30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1aa40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1aa50 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55   pTemplate is NU
1aa60 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1aa70 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1aa80 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69  AD);..}...identi
1aa90 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74  ty_idx = hObject
1aaa0 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   - 1;...mutex_re
1aab0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1aac0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1aad0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1aae0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1aaf0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ab00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ab10 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1ab20 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1ab30 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1ab40 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
1ab50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1ab60 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
1ab70 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1ab80 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1ab90 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1aba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1abb0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1abc0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1abd0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1abe0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1abf0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75  NVALID);..}...nu
1ac00 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73  m_ids = cackey_s
1ac10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ac20 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1ac30 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  nt;...if (identi
1ac40 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64  ty_idx >= num_id
1ac50 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  s) {...cackey_mu
1ac60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ac70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1ac80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ac90 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
1aca0 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
1acb0 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74   range.  identit
1acc0 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d  y_idx = %lu, num
1acd0 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75  _ids = %lu.", (u
1ace0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
1acf0 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73  entity_idx, (uns
1ad00 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f  igned long) num_
1ad10 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ids);....return(
1ad20 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
1ad30 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1ad40 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  .identity = &cac
1ad50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1ad60 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1ad70 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b  s[identity_idx];
1ad80 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
1ad90 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
1ada0 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69   ulCount; attr_i
1adb0 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61  dx++) {...curr_a
1adc0 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65  ttr = &pTemplate
1add0 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70  [attr_idx];....p
1ade0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
1adf0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
1ae00 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41  _LONG) -1;....CA
1ae10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ae20 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  F("Looking for a
1ae30 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78  ttribute 0x%08lx
1ae40 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20   (identity:%lu) 
1ae50 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1ae60 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
1ae70 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  >type, (unsigned
1ae80 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
1ae90 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65  idx);....for (se
1aea0 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
1aeb0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
1aec0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
1aed0 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
1aee0 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
1aef0 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
1af00 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1af10 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20  _attr_idx].type 
1af20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  == curr_attr->ty
1af30 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  pe) {.....CACKEY
1af40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1af50 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56  ... found it, pV
1af60 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c  alue = %p, ulVal
1af70 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64  ueLen = %lu", id
1af80 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
1af90 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1afa0 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69  ].pValue, identi
1afb0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
1afc0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
1afd0 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a  ValueLen);......
1afe0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65  ....pValue = ide
1aff0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
1b000 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
1b010 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56  .pValue;.....ulV
1b020 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69  alueLen = identi
1b030 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
1b040 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
1b050 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09  ValueLen;....}..
1b060 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61  .}....if (curr_a
1b070 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70  ttr->pValue && p
1b080 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28  Value) {....if (
1b090 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
1b0a0 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65  ueLen >= ulValue
1b0b0 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70  Len) {.....memcp
1b0c0 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  y(curr_attr->pVa
1b0d0 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56  lue, pValue, ulV
1b0e0 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65  alueLen);....} e
1b0f0 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75  lse {.....ulValu
1b100 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
1b110 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c   -1;......retval
1b120 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
1b130 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09  O_SMALL;....}...
1b140 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e  }....curr_attr->
1b150 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
1b160 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75  alueLen;..}...mu
1b170 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1b180 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1b190 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1b1a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1b1b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1b1c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b1d0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1b1e0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1b1f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1b200 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1b210 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
1b220 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
1b230 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09  YPE_INVALID) {..
1b240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b250 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1b260 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
1b270 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22  PE_INVALID (%i)"
1b280 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
1b290 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
1b2a0 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  val == CKR_BUFFE
1b2b0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
1b2c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b2d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1b2e0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
1b2f0 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74  MALL (%i)", (int
1b300 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
1b310 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
1b320 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
1b330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b340 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1b350 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  OK (%i)", (int) 
1b360 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
1b370 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b380 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b390 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
1b3a0 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
1b3b0 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
1b3c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1b3d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41  ON(CK_RV, C_SetA
1b3e0 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
1b3f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1b400 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
1b410 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
1b420 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
1b430 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
1b440 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
1b450 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
1b460 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1b470 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1b480 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1b490 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b4a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b4b0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1b4c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b4d0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1b4e0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1b4f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1b500 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1b510 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1b520 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1b530 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1b540 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1b550 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1b560 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1b570 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1b580 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1b590 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
1b5a0 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  tsInit)(CK_SESSI
1b5b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1b5c0 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
1b5d0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
1b5e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
1b5f0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
1b600 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
1b610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1b620 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1b630 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1b640 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1b650 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b660 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1b670 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1b680 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1b690 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1b6a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
1b6b0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
1b6c0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
1b6d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1b6e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1b6f0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
1b700 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b710 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b720 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
1b730 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
1b740 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1b750 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1b760 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1b770 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1b780 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1b790 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1b7a0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1b7b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b7c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b7d0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1b7e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b7f0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1b800 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
1b810 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1b820 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
1b830 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1b840 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1b850 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1b860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b870 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1b880 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1b890 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1b8a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1b8b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
1b8c0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
1b8d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1b8e0 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  ch_active) {...c
1b8f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1b900 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1b910 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1b920 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b930 72 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65 61  r.  Search alrea
1b940 64 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  dy active.");...
1b950 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
1b960 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
1b970 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1b980 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65  _slots[cackey_se
1b990 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1b9a0 2e 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65  .slotID].slot_re
1b9b0 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  set) {...CACKEY_
1b9c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68  DEBUG_PRINTF("Th
1b9d0 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20  e slot has been 
1b9e0 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c  reset since we l
1b9f0 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69  ast looked for i
1ba00 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73  dentities -- res
1ba10 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66  canning");....if
1ba20 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
1ba30 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1ba40 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
1ba50 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  {....cackey_free
1ba60 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b  _identities(cack
1ba70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1ba80 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1ba90 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
1baa0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1bab0 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
1bac0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1bad0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
1bae0 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
1baf0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1bb00 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
1bb10 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20  ntities_count = 
1bb20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61  0;...}....if (ca
1bb30 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65  ckey_slots[cacke
1bb40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1bb50 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2e 6c 61 62  ion].slotID].lab
1bb60 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  el != NULL) {...
1bb70 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
1bb80 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ts[cackey_sessio
1bb90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
1bba0 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09  tID].label);....
1bbb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63  cackey_slots[cac
1bbc0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1bbd0 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2e 6c  ssion].slotID].l
1bbe0 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
1bbf0 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1bc00 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  [cackey_sessions
1bc10 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
1bc20 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  D].slot_reset = 
1bc30 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1bc40 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s[cackey_session
1bc50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
1bc60 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
1bc70 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
1bc80 49 52 45 44 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  IRED;..}...if (c
1bc90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1bca0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1bcb0 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies == NULL) {..
1bcc0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1bcd0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1bce0 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
1bcf0 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26  ead_identities(&
1bd00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63  cackey_slots[cac
1bd10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1bd20 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20  ssion].slotID], 
1bd30 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
1bd40 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1bd50 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d  ities_count);..}
1bd60 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
1bd70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66   != NULL) {...if
1bd80 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
1bd90 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  {....cackey_sess
1bda0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1bdb0 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
1bdc0 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09  t = ulCount;....
1bdd0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1bde0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1bdf0 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28  _query = malloc(
1be00 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  ulCount * sizeof
1be10 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a  (*pTemplate));..
1be20 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
1be30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1be40 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1be50 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43  , pTemplate, ulC
1be60 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
1be70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 7d 20  Template));...} 
1be80 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79  else {....cackey
1be90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1bea0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1beb0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63  _count = 0;....c
1bec0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1bed0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1bee0 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  query = NULL;...
1bef0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
1bf00 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
1bf10 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
1bf20 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1bf30 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41  biglock);.....CA
1bf40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bf50 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
1bf60 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69 65  h query specifie
1bf70 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e  d as NULL, but n
1bf80 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74  umber of query t
1bf90 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69  erms not specifi
1bfa0 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09  ed as 0.");.....
1bfb0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1bfc0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a  ENTS_BAD);...}..
1bfd0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1bfe0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1bff0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
1c000 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73   0;...cackey_ses
1c010 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1c020 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e  search_query = N
1c030 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ULL;..}...cackey
1c040 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1c050 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
1c060 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73  e = 1;..cackey_s
1c070 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c080 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
1c090 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   = 0;...mutex_re
1c0a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1c0b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1c0c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1c0d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1c0e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1c0f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c100 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1c110 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1c120 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1c130 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1c140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c150 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1c160 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1c170 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1c180 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1c190 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1c1a0 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29  , C_FindObjects)
1c1b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1c1c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1c1d0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
1c1e0 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  R phObject, CK_U
1c1f0 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74  LONG ulMaxObject
1c200 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  Count, CK_ULONG_
1c210 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75  PTR pulObjectCou
1c220 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nt) {..struct ca
1c230 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63  ckey_identity *c
1c240 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52  urr_id;..CK_ATTR
1c250 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
1c260 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72  ;..CK_ULONG curr
1c270 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75  _id_idx, curr_ou
1c280 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61  t_id_idx, curr_a
1c290 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
1c2a0 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e  tr_idx;..CK_ULON
1c2b0 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c  G matched_count,
1c2c0 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f   prev_matched_co
1c2d0 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  unt;..int mutex_
1c2e0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1c2f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1c300 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1c310 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1c320 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1c330 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c340 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1c350 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1c360 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1c370 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1c380 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f  );..}...if (pulO
1c390 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55  bjectCount == NU
1c3a0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1c3b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c3c0 6f 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f  or.  pulObjectCo
1c3d0 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  unt is NULL.");.
1c3e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1c3f0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1c400 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20  ...if (phObject 
1c410 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78  == NULL && ulMax
1c420 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30  ObjectCount == 0
1c430 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
1c440 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20  ircuit, if zero 
1c450 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65  objects were spe
1c460 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65  cified return ze
1c470 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61  ro items immedia
1c480 74 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62  tely */...*pulOb
1c490 6a 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a  jectCount = 0;..
1c4a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c4b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1c4c0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
1c4d0 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
1c4e0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
1c4f0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
1c500 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20  if (phObject == 
1c510 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1c520 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c530 72 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20  rror.  phObject 
1c540 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1c550 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1c560 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1c570 66 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  f (ulMaxObjectCo
1c580 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  unt == 0) {...CA
1c590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c5a0 46 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d  F("Error.  Maxim
1c5b0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  um number of obj
1c5c0 65 63 74 73 20 73 70 65 63 69 66 69 65 64 20 61  ects specified a
1c5d0 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65  s zero.");....re
1c5e0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1c5f0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1c600 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1c610 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1c620 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1c630 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1c640 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1c650 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1c660 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c670 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1c680 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1c690 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1c6a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1c6b0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1c6c0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1c6d0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1c6e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1c6f0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1c700 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1c710 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c720 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1c730 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1c740 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1c750 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1c760 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1c770 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1c780 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1c790 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1c7a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1c7b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c7c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c7d0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1c7e0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1c7f0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1c800 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1c810 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1c820 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1c830 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
1c840 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1c850 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1c860 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1c870 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c880 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
1c890 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  ch not active.")
1c8a0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1c8b0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
1c8c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1c8d0 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ...curr_out_id_i
1c8e0 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75  dx = 0;..for (cu
1c8f0 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b  rr_id_idx = cack
1c900 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1c910 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
1c920 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64  r_id; curr_id_id
1c930 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
1c940 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
1c950 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26  entities_count &
1c960 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  & ulMaxObjectCou
1c970 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b  nt; curr_id_idx+
1c980 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d  +) {...curr_id =
1c990 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
1c9a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1c9b0 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69  tities[curr_id_i
1c9c0 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  dx];....CACKEY_D
1c9d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f  EBUG_PRINTF("Pro
1c9e0 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79  cessing identity
1c9f0 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64  :%lu", (unsigned
1ca00 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69   long) curr_id_i
1ca10 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f  dx);....matched_
1ca20 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f  count = 0;....fo
1ca30 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78  r (curr_attr_idx
1ca40 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f   = 0; curr_attr_
1ca50 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
1ca60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ca70 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
1ca80 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64  nt; curr_attr_id
1ca90 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d  x++) {....prev_m
1caa0 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d  atched_count = m
1cab0 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09  atched_count;...
1cac0 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63  ..curr_attr = &c
1cad0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1cae0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1caf0 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f  query[curr_attr_
1cb00 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59  idx];.....CACKEY
1cb10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1cb20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74   Checking for at
1cb30 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78 20  tribute 0x%08lx 
1cb40 69 6e 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e  in identity:%i..
1cb50 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1cb60 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74  ng) curr_attr->t
1cb70 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  ype, (int) curr_
1cb80 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b  id_idx);....CACK
1cb90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
1cba0 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f  F("    Value loo
1cbb0 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72  king for:", curr
1cbc0 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
1cbd0 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
1cbe0 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28  eLen);.....for (
1cbf0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20  sess_attr_idx = 
1cc00 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  0; sess_attr_idx
1cc10 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72   < curr_id->attr
1cc20 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65  ibutes_count; se
1cc30 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  ss_attr_idx++) {
1cc40 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 69 64  .....if (curr_id
1cc50 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
1cc60 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65  s_attr_idx].type
1cc70 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74   == curr_attr->t
1cc80 79 70 65 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ype) {......CACK
1cc90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cca0 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d  "    ... found m
1ccb0 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e  atching type ...
1ccc0 22 29 3b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ");......CACKEY_
1ccd0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
1cce0 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75      ... our valu
1ccf0 65 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74  e:", curr_id->at
1cd00 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1cd10 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  tr_idx].pValue, 
1cd20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
1cd30 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
1cd40 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
1cd50 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 61  ......if (curr_a
1cd60 74 74 72 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e  ttr->pValue == N
1cd70 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ULL) {.......CAC
1cd80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cd90 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
1cda0 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63  nd wildcard matc
1cdb0 68 22 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63  h");........matc
1cdc0 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09  hed_count++;....
1cdd0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
1cde0 7d 0a 0a 20 09 09 09 09 09 69 66 20 28 63 75 72  }.. .....if (cur
1cdf0 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
1ce00 65 6e 20 3d 3d 20 63 75 72 72 5f 69 64 2d 3e 61  en == curr_id->a
1ce10 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
1ce20 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
1ce30 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 63 75  Len && memcmp(cu
1ce40 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
1ce50 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
1ce60 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
1ce70 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72  dx].pValue, curr
1ce80 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
1ce90 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
1cea0 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29  lValueLen) == 0)
1ceb0 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
1cec0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
1ced0 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65       ... found e
1cee0 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09  xact match");...
1cef0 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75  .....matched_cou
1cf00 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65  nt++;........bre
1cf10 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ak;......}.....}
1cf20 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20  ....}...../* If 
1cf30 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63 6f  the attribute co
1cf40 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68  uld not be match
1cf50 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74  ed, do not try t
1cf60 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e  o match addition
1cf70 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f  al attributes */
1cf80 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74  ....if (prev_mat
1cf90 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61  ched_count == ma
1cfa0 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09  tched_count) {..
1cfb0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09  ...break;....}..
1cfc0 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65  .}....if (matche
1cfd0 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65  d_count == cacke
1cfe0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1cff0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1d000 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41  y_count) {....CA
1d010 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d020 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20  F("  ... All %i 
1d030 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
1d040 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64  ed for found, ad
1d050 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69  ding identity:%i
1d060 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73   to returned lis
1d070 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  t", (int) cackey
1d080 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d090 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1d0a0 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
1d0b0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09  rr_id_idx);.....
1d0c0 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75  phObject[curr_ou
1d0d0 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72  t_id_idx] = curr
1d0e0 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09  _id_idx + 1;....
1d0f0 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  .ulMaxObjectCoun
1d100 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75  t--;.....curr_ou
1d110 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20  t_id_idx++;...} 
1d120 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
1d130 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1d140 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20   ... Not all %i 
1d150 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20  (only found %i) 
1d160 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
1d170 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f  ed for found, no
1d180 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  t adding identit
1d190 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63  y:%i", (int) cac
1d1a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1d1b0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1d1c0 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  ery_count, (int)
1d1d0 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20   matched_count, 
1d1e0 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
1d1f0 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b  x);...}..}..cack
1d200 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d210 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
1d220 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69  r_id = curr_id_i
1d230 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43  dx;..*pulObjectC
1d240 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f  ount = curr_out_
1d250 69 64 5f 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f  id_idx;...mutex_
1d260 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1d270 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1d280 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1d290 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1d2a0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1d2b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d2c0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1d2d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1d2e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1d2f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1d300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d310 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1d320 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f  R_OK (%i), num o
1d330 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43  bjects = %lu", C
1d340 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63  KR_OK, *pulObjec
1d350 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72  tCount);...retur
1d360 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1d370 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1d380 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
1d390 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53  jectsFinal)(CK_S
1d3a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1d3b0 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d  ession) {..int m
1d3c0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
1d3d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d3e0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1d3f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1d400 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...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 4e 6f 74 20 69  F("Error.  Not i
1d430 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1d440 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1d450 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1d460 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1d470 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
1d480 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
1d490 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1d4a0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1d4b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d4c0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1d4d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d4e0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
1d4f0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
1d500 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1d510 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1d520 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1d530 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1d540 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1d550 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d560 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1d570 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1d580 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d590 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1d5a0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1d5b0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1d5c0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1d5d0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1d5e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1d5f0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1d600 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1d610 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1d620 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d630 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1d640 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1d650 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1d660 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1d670 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1d680 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1d690 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d6a0 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
1d6b0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1d6c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1d6d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1d6e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d6f0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
1d700 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  h not active.");
1d710 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1d720 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
1d730 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1d740 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1d750 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1d760 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  ch_active = 0;..
1d770 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1d780 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1d790 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09  arch_query) {...
1d7a0 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
1d7b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1d7c0 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d  earch_query);..}
1d7d0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1d7e0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1d7f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1d800 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1d810 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1d820 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d830 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d840 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1d850 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1d860 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1d870 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1d880 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1d890 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1d8a0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1d8b0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1d8c0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1d8d0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
1d8e0 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ncryptInit)(CK_S
1d8f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1d900 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
1d910 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
1d920 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
1d930 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
1d940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d950 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1d960 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1d970 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1d980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d990 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1d9a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1d9b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1d9c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1d9d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1d9e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d9f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1da00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1da10 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1da20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1da30 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1da40 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1da50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1da60 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1da70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1da80 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Encrypt)(CK_SESS
1da90 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1daa0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1dab0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
1dac0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
1dad0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
1dae0 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  edData, CK_ULONG
1daf0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
1db00 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  dDataLen) {..CAC
1db10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1db20 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1db30 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1db40 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1db50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1db60 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1db70 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1db80 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1db90 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1dba0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1dbb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1dbc0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1dbd0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1dbe0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1dbf0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1dc00 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1dc10 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1dc20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1dc30 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1dc40 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
1dc50 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
1dc60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1dc70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1dc80 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
1dc90 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
1dca0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
1dcb0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
1dcc0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
1dcd0 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
1dce0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1dcf0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1dd00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1dd10 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1dd20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dd30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1dd40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1dd50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1dd60 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1dd70 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1dd80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dd90 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1dda0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1ddb0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1ddc0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ddd0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1dde0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1ddf0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1de00 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1de10 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1de20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28  C_EncryptFinal)(
1de30 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1de40 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1de50 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63  YTE_PTR pLastEnc
1de60 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
1de70 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
1de80 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
1de90 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1dea0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1deb0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1dec0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1ded0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1dee0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1def0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1df00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1df10 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1df20 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1df30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1df40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1df50 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1df60 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1df70 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1df80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1df90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1dfa0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1dfb0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1dfc0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1dfd0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69  RV, C_DecryptIni
1dfe0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1dff0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1e000 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
1e010 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
1e020 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
1e030 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  y) {..int mutex_
1e040 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d  retval;...hKey--
1e050 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1e060 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1e070 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1e080 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1e090 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e0a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1e0b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1e0c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e0d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1e0e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1e0f0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
1e100 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1e110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e120 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
1e130 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  nism is NULL.");
1e140 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1e150 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1e160 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
1e170 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
1e180 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b   CKM_RSA_PKCS) {
1e190 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e1a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1e1b0 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
1e1c0 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69  nism not specifi
1e1d0 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b  ed as CKM_RSA_PK
1e1e0 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  CS");....return(
1e1f0 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41  CKR_MECHANISM_PA
1e200 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  RAM_INVALID);..}
1e210 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1e220 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1e230 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1e240 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1e250 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1e260 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1e270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e280 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1e290 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1e2a0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1e2b0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1e2c0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1e2d0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1e2e0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1e2f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1e300 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1e310 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1e320 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e330 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1e340 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1e350 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e360 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1e370 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1e380 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1e390 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1e3a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1e3b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1e3c0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1e3d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e3e0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1e3f0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1e400 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1e410 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1e420 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
1e430 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e440 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1e450 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1e460 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1e470 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1e480 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1e490 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e4a0 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79   Decrypt already
1e4b0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
1e4c0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1e4d0 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
1e4e0 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
1e4f0 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
1e500 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1e510 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1e520 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1e530 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1e540 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1e550 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e560 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
1e570 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
1e580 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79  e (requested key
1e590 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69   %lu, only %lu i
1e5a0 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61  dentities availa
1e5b0 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ble).", (unsigne
1e5c0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75  d long) hKey, (u
1e5d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
1e5e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e5f0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1e600 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  es_count);....re
1e610 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
1e620 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1e630 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1e640 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
1e650 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b  rypt_active = 1;
1e660 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1e670 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
1e680 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  rypt_mechanism =
1e690 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
1e6a0 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f  hanism;..cackey_
1e6b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1e6c0 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
1e6d0 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  parm = pMechanis
1e6e0 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09  m->pParameter;..
1e6f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1e700 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
1e710 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d  t_mech_parmlen =
1e720 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50   pMechanism->ulP
1e730 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61  arameterLen;..ca
1e740 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e750 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1e760 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
1e770 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1e780 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
1e790 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
1e7a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1e7b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1e7c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1e7d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1e7e0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1e7f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e800 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1e810 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1e820 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1e830 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1e840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e850 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1e860 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1e870 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1e880 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1e890 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1e8a0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43  RV, C_Decrypt)(C
1e8b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1e8c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1e8d0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
1e8e0 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dData, CK_ULONG 
1e8f0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
1e900 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
1e910 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
1e920 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
1e930 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61  {..CK_ULONG data
1e940 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61  len_update, data
1e950 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52  len_final;..CK_R
1e960 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a  V decrypt_ret;..
1e970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e980 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1e990 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1e9a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1e9b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e9c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1e9d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1e9e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1e9f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1ea00 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1ea10 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d  f (pulDataLen ==
1ea20 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1ea30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ea40 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65  Error. pulDataLe
1ea50 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
1ea60 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1ea70 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1ea80 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20  .datalen_update 
1ea90 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a  = *pulDataLen;..
1eaa0 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
1eab0 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68  _DecryptUpdate(h
1eac0 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70  Session, pEncryp
1ead0 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79  tedData, ulEncry
1eae0 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61  ptedDataLen, pDa
1eaf0 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64  ta, &datalen_upd
1eb00 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79  ate);..if (decry
1eb10 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
1eb20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1eb30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1eb40 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65  .  DecryptUpdate
1eb50 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
1eb60 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
1eb70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1eb80 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
1eb90 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
1eba0 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  t_ret);..}...if 
1ebb0 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74  (pData) {...pDat
1ebc0 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64  a += datalen_upd
1ebd0 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e  ate;..}..datalen
1ebe0 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74  _final = *pulDat
1ebf0 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75  aLen - datalen_u
1ec00 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74  pdate;...decrypt
1ec10 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74  _ret = C_Decrypt
1ec20 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
1ec30 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
1ec40 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63  final);..if (dec
1ec50 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
1ec60 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
1ec70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ec80 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61  or.  DecryptFina
1ec90 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
1eca0 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
1ecb0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1ecc0 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b  g) decrypt_ret);
1ecd0 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
1ece0 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70  pt_ret);..}...*p
1ecf0 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61  ulDataLen = data
1ed00 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74  len_update + dat
1ed10 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41  alen_final;...CA
1ed20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ed30 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1ed40 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1ed50 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1ed60 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1ed70 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1ed80 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61  V, C_DecryptUpda
1ed90 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
1eda0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1edb0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
1edc0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
1edd0 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
1ede0 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
1edf0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
1ee00 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
1ee10 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
1ee20 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34  K_BYTE buf[16384
1ee30 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c  ];..ssize_t bufl
1ee40 65 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  en;..CK_RV retva
1ee50 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
1ee60 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65  ERROR;..int mute
1ee70 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
1ee80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ee90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1eea0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1eeb0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1eec0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1eed0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1eee0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1eef0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1ef00 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1ef10 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
1ef20 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
1ef30 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
1ef40 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1ef50 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1ef60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1ef70 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1ef80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ef90 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
1efa0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
1efb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1efc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1efd0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  LID);..}...if (p
1efe0 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d  EncryptedPart ==
1eff0 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79   NULL && ulEncry
1f000 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30  ptedPartLen == 0
1f010 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
1f020 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65  ircuit if we are
1f030 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70   asked to decryp
1f040 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a  t nothing... */.
1f050 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f060 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1f070 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
1f080 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
1f090 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
1f0a0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
1f0b0 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61  if (pEncryptedPa
1f0c0 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
1f0d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f0e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63  NTF("Error. pEnc
1f0f0 72 79 70 74 65 64 50 61 72 74 20 69 73 20 4e 55  ryptedPart is NU
1f100 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70  LL, but ulEncryp
1f110 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f  tedPartLen is no
1f120 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  t 0.");....retur
1f130 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1f140 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
1f150 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
1f160 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  n == 0) {...CACK
1f170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f180 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70  "Error. ulEncryp
1f190 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c  tedPartLen is 0,
1f1a0 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f   but pPart is no
1f1b0 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
1f1c0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1f1d0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1f1e0 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20   (pulPartLen == 
1f1f0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1f200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f210 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e  rror. pulPartLen
1f220 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1f230 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1f240 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1f250 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1f260 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1f270 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1f280 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1f290 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1f2a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f2b0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1f2c0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1f2d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1f2e0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1f2f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1f300 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1f310 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1f320 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1f330 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1f340 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1f350 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f360 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1f370 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1f380 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1f390 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1f3a0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1f3b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1f3c0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
1f3d0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1f3e0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1f3f0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1f400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f410 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
1f420 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65  crypt not active
1f430 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1f440 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
1f450 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1f460 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
1f470 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1f480 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1f490 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
1f4a0 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
1f4b0 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64  :..../* Ask card
1f4c0 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09   to decrypt */..
1f4d0 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65  ..buflen = cacke
1f4e0 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63  y_signdecrypt(&c
1f4f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b  ackey_slots[cack
1f500 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1f510 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 63  sion].slotID], c
1f520 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1f530 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
1f540 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72  _identity, pEncr
1f550 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63  yptedPart, ulEnc
1f560 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62  ryptedPartLen, b
1f570 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c  uf, sizeof(buf),
1f580 20 30 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28   0, 1);.....if (
1f590 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  buflen < 0) {...
1f5a0 09 09 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e 20  ../* Decryption 
1f5b0 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 72  failed. */.....r
1f5c0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45  etval = CKR_GENE
1f5d0 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 7d 20  RAL_ERROR;....} 
1f5e0 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67  else if (((unsig
1f5f0 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e  ned long) buflen
1f600 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20  ) > *pulPartLen 
1f610 26 26 20 70 50 61 72 74 29 20 7b 0a 09 09 09 09  && pPart) {.....
1f620 2f 2a 20 44 65 63 72 79 70 74 65 64 20 64 61 74  /* Decrypted dat
1f630 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09  a too large */..
1f640 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
1f650 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
1f660 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
1f670 09 09 69 66 20 28 70 50 61 72 74 29 20 7b 0a 09  ..if (pPart) {..
1f680 09 09 09 09 6d 65 6d 63 70 79 28 70 50 61 72 74  ....memcpy(pPart
1f690 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a  , buf, buflen);.
1f6a0 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50  ....}......*pulP
1f6b0 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  artLen = buflen;
1f6c0 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
1f6d0 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09  KR_OK;....}.....
1f6e0 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65  break;..}...mute
1f6f0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1f700 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1f710 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f720 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1f730 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1f740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f750 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1f760 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1f770 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1f780 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1f790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f7a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1f7b0 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  %i", (int) retva
1f7c0 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
1f7d0 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  val);.}..CK_DEFI
1f7e0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1f7f0 56 2c 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61  V, C_DecryptFina
1f800 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
1f810 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1f820 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74  K_BYTE_PTR pLast
1f830 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
1f840 54 52 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  TR pulLastPartLe
1f850 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
1f860 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72  retval;..int ter
1f870 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d  minate_decrypt =
1f880 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   1;...CACKEY_DEB
1f890 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f8a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1f8b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1f8c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f8d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f8e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1f8f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f900 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1f910 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1f920 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
1f930 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
1f940 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
1f950 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1f960 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1f970 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
1f980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f990 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1f9a0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
1f9b0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
1f9c0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1f9d0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1f9e0 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61 73 74  .}...if (pulLast
1f9f0 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  PartLen == NULL)
1fa00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fa10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fa20 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20   pulLastPartLen 
1fa30 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1fa40 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1fa50 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
1fa60 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1fa70 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1fa80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1fa90 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1faa0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1fab0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fac0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1fad0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1fae0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1faf0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1fb00 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1fb10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1fb20 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1fb30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1fb40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1fb50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fb60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1fb70 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1fb80 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1fb90 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1fba0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1fbb0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1fbc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1fbd0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
1fbe0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1fbf0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1fc00 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1fc10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fc20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
1fc30 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e  rypt not active.
1fc40 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1fc50 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
1fc60 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1fc70 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72  .}...*pulLastPar
1fc80 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28  tLen = 0;...if (
1fc90 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c  pLastPart == NUL
1fca0 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65  L) {...terminate
1fcb0 5f 64 65 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d  _decrypt = 0;..}
1fcc0 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65  ...if (terminate
1fcd0 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 09 63 61  _decrypt) {...ca
1fce0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1fcf0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1fd00 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
1fd10 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1fd20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1fd30 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1fd40 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1fd50 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1fd60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fd70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1fd80 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1fd90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fda0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1fdb0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1fdc0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1fdd0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1fde0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1fdf0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1fe00 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1fe10 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
1fe20 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  estInit)(CK_SESS
1fe30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1fe40 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
1fe50 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
1fe60 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1fe70 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1fe80 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1fe90 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1fea0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1feb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fec0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1fed0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1fee0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1fef0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1ff00 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ff10 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1ff20 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1ff30 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1ff40 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1ff50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1ff60 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1ff70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ff80 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1ff90 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1ffa0 52 56 2c 20 43 5f 44 69 67 65 73 74 29 28 43 4b  RV, C_Digest)(CK
1ffb0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1ffc0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1ffd0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
1ffe0 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
1fff0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69   CK_BYTE_PTR pDi
20000 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  gest, CK_ULONG_P
20010 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29  TR pulDigestLen)
20020 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
20030 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
20040 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20050 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20060 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20070 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20080 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20090 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
200a0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
200b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
200c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
200d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
200e0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
200f0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
20100 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
20110 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20120 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
20130 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
20140 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
20150 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
20160 56 2c 20 43 5f 44 69 67 65 73 74 55 70 64 61 74  V, C_DigestUpdat
20170 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
20180 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
20190 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
201a0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
201b0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
201c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
201d0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
201e0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
201f0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
20200 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20210 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
20220 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
20230 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
20240 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
20250 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
20260 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20270 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
20280 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20290 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
202a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
202b0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
202c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
202d0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
202e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
202f0 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
20300 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
20310 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
20320 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
20330 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
20340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20350 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
20360 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20370 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20390 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
203a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
203b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
203c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
203d0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
203e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
203f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
20400 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20410 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
20420 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20430 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
20440 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20450 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
20460 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20470 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
20480 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  stFinal)(CK_SESS
20490 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
204a0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
204b0 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f   pDigest, CK_ULO
204c0 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74  NG_PTR pulDigest
204d0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
204e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
204f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20500 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20510 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20520 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20530 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20540 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20550 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20560 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20570 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
20580 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20590 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
205a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
205b0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
205c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
205d0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
205e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
205f0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
20600 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20610 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69  CK_RV, C_SignIni
20620 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
20630 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
20640 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
20650 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
20660 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
20670 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  y) {..int mutex_
20680 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d  retval;...hKey--
20690 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
206a0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
206b0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
206c0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
206d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
206e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
206f0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20700 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20710 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20720 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20730 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
20740 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
20750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20760 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
20770 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  nism is NULL.");
20780 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
20790 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
207a0 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
207b0 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
207c0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 26 26   CKM_RSA_PKCS &&
207d0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
207e0 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 53 48  hanism != CKM_SH
207f0 41 31 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09  A1_RSA_PKCS) {..
20800 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20810 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
20820 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
20830 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  sm not specified
20840 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   as CKM_RSA_PKCS
20850 20 6f 72 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41   or CKM_SHA1_RSA
20860 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75  _PKCS");....retu
20870 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d  rn(CKR_MECHANISM
20880 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b  _PARAM_INVALID);
20890 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
208a0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
208b0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
208c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
208d0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
208e0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
208f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20900 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20910 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
20920 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
20930 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
20940 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
20950 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
20960 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
20970 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
20980 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
20990 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
209a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
209b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
209c0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
209d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
209e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
209f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
20a00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20a10 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
20a20 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
20a30 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20a40 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
20a50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20a60 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
20a70 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
20a80 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
20a90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
20aa0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
20ab0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
20ac0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
20ad0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
20ae0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20af0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20b00 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20b10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20b20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e   Sign already in
20b30 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09   progress.");...
20b40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
20b50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
20b60 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e  ..}...if (hKey >
20b70 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
20b80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
20b90 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
20ba0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
20bb0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
20bc0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
20bd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20be0 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c  rror.  Key handl
20bf0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28  e out of range (
20c00 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c  requested key %l
20c10 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e  u, only %lu iden
20c20 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65  tities available
20c30 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
20c40 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69  ong) hKey, (unsi
20c50 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65  gned long) cacke
20c60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20c70 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
20c80 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
20c90 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45  n(CKR_KEY_HANDLE
20ca0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
20cb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20cc0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
20cd0 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63  ctive = 1;...cac
20ce0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20cf0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68  ssion].sign_mech
20d00 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69  anism = pMechani
20d10 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a  sm->mechanism;..
20d20 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20d30 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
20d40 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63  buflen = 128;..c
20d50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20d60 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
20d70 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b  fused = 0;..cack
20d80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20d90 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
20da0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
20db0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20dc0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
20dd0 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73  uf) * cackey_ses
20de0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20df0 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09  sign_buflen);...
20e00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20e10 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75  NTF("Session %lu
20e20 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69   sign_identity i
20e30 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 20 23  s %p (identity #
20e40 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
20e50 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c   long) hSession,
20e60 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
20e70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
20e80 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75  tities[hKey], (u
20e90 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
20ea0 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ey);..cackey_ses
20eb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20ec0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20  sign_identity = 
20ed0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
20ee0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
20ef0 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d  ities[hKey];...m
20f00 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
20f10 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
20f20 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
20f30 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
20f40 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
20f50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20f60 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
20f70 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
20f80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
20f90 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
20fa0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
20fb0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20fc0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
20fd0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
20fe0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
20ff0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21000 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29  N(CK_RV, C_Sign)
21010 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
21020 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
21030 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
21040 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
21050 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
21060 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
21070 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
21080 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 4b 5f  atureLen) {..CK_
21090 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 0a 09 43  RV sign_ret;...C
210a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
210b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
210c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
210d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
210e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
210f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
21100 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
21110 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
21120 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
21130 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 69 67  LIZED);..}...sig
21140 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70  n_ret = C_SignUp
21150 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70  date(hSession, p
21160 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29  Data, ulDataLen)
21170 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ;..if (sign_ret 
21180 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
21190 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
211a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
211b0 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65  Update() returne
211c0 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
211d0 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
211e0 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
211f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  );....return(sig
21200 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67  n_ret);..}...sig
21210 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69  n_ret = C_SignFi
21220 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53  nal(hSession, pS
21230 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67  ignature, pulSig
21240 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20  natureLen);..if 
21250 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52  (sign_ret != CKR
21260 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
21270 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21280 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28  ror.  SignFinal(
21290 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
212a0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
212b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
212c0 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72   sign_ret);....r
212d0 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
212e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
212f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21300 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
21310 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
21320 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
21330 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
21340 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
21350 6e 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  nUpdate)(CK_SESS
21360 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
21370 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
21380 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
21390 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69   ulPartLen) {..i
213a0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
213b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
213c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
213d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
213e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
213f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21400 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21410 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21420 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21430 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21440 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21450 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
21460 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
21470 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
21480 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
21490 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
214a0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
214b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
214c0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
214d0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
214e0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
214f0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
21500 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
21510 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e  ..if (pPart == N
21520 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e  ULL && ulPartLen
21530 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
21540 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77  ort circuit if w
21550 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73  e are asked to s
21560 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a  ign nothing... *
21570 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
21580 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
21590 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
215a0 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
215b0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
215c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
215d0 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e  ..if (pPart == N
215e0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
215f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21600 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55  ror. pPart is NU
21610 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65  LL, but ulPartLe
21620 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a  n is not 0.");..
21630 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
21640 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
21650 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20  ..if (ulPartLen 
21660 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
21670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21680 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20  rror. ulPartLen 
21690 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20  is 0, but pPart 
216a0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
216b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
216c0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
216d0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
216e0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
216f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21700 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
21710 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
21720 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21730 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
21740 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
21750 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
21760 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
21770 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
21780 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21790 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
217a0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
217b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
217c0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
217d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
217e0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
217f0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
21800 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
21810 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
21820 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
21830 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21840 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
21850 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
21860 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21870 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21880 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21890 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
218a0 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  gn not active.")
218b0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
218c0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
218d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
218e0 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
218f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21900 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
21910 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ism) {...case CK
21920 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f  M_RSA_PKCS:..../
21930 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72  * Accumulate dir
21940 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28  ectly */....if (
21950 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21960 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
21970 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72 74  bufused + ulPart
21980 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73 65  Len) > cackey_se
21990 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
219a0 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a  .sign_buflen) {.
219b0 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
219c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
219d0 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a  gn_buflen *= 2;.
219e0 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
219f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
21a00 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f  ign_buf = reallo
21a10 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  c(cackey_session
21a20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
21a30 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61  _buf, sizeof(*ca
21a40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21a50 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
21a60 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) * cackey_sessi
21a70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
21a80 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d  gn_buflen);....}
21a90 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(cack
21aa0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21ab0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b  sion].sign_buf +
21ac0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
21ad0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
21ae0 62 75 66 75 73 65 64 2c 20 70 50 61 72 74 2c 20  bufused, pPart, 
21af0 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09  ulPartLen);.....
21b00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21b10 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
21b20 75 66 75 73 65 64 20 2b 3d 20 75 6c 50 61 72 74  ufused += ulPart
21b30 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  Len;.....break;.
21b40 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f  ..case CKM_SHA1_
21b50 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
21b60 58 58 58 3a 20 41 63 63 75 6d 75 6c 61 74 65 20  XXX: Accumulate 
21b70 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73 68  into a SHA1 hash
21b80 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75   */....cackey_mu
21b90 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21ba0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
21bb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21bc0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
21bd0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21be0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
21bf0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
21c00 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
21c10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
21c20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21c30 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  TED);....break;.
21c40 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
21c50 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
21c60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21c70 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21c80 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21c90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21ca0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21cb0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
21cc0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21cd0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21ce0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
21cf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
21d00 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
21d10 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
21d20 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
21d30 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
21d40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
21d50 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53  _SignFinal)(CK_S
21d60 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
21d70 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
21d80 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
21d90 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
21da0 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
21db0 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20  .static CK_BYTE 
21dc0 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73  sigbuf[1024];..s
21dd0 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c 65 6e  size_t sigbuflen
21de0 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
21df0 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
21e00 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e  ROR;..int termin
21e10 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69  ate_sign = 1;..i
21e20 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
21e30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21e40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21e50 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
21e60 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
21e70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21e80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21e90 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21ea0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21eb0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21ec0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21ed0 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72  .if (pulSignatur
21ee0 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  eLen == NULL) {.
21ef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21f00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
21f10 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73  lSignatureLen is
21f20 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
21f30 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
21f40 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
21f50 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
21f60 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
21f70 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
21f80 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
21f90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21fa0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
21fb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21fc0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
21fd0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
21fe0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
21ff0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
22000 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
22010 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
22020 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
22030 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22040 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
22050 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
22060 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22070 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
22080 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
22090 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
220a0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
220b0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
220c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
220d0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
220e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
220f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
22100 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22110 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
22120 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
22130 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
22140 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
22150 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
22160 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
22170 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22180 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
22190 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
221a0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
221b0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
221c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
221d0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
221e0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
221f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
22200 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
22210 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77  ALIZED);..}...sw
22220 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
22230 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
22240 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
22250 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
22260 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
22270 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f   card to sign */
22280 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
22290 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20  _PRINTF("Asking 
222a0 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65  to sign from ide
222b0 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 73 73  ntity %p in sess
222c0 69 6f 6e 20 25 6c 75 22 2c 20 63 61 63 6b 65 79  ion %lu", cackey
222d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
222e0 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
222f0 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
22300 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a 09 09  g) hSession);...
22310 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63  .sigbuflen = cac
22320 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
22330 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61  &cackey_slots[ca
22340 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22350 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c  ession].slotID],
22360 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
22370 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
22380 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79  identity, cackey
22390 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
223a0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61  on].sign_buf, ca
223b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
223c0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
223d0 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69  used, sigbuf, si
223e0 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c  zeof(sigbuf), 1,
223f0 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67   0);.....if (sig
22400 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  buflen < 0) {...
22410 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69  ../* Signing fai
22420 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76  led. */.....retv
22430 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
22440 5f 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73  _ERROR;....} els
22450 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64  e if (((unsigned
22460 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e   long) sigbuflen
22470 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72  ) > *pulSignatur
22480 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75  eLen && pSignatu
22490 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67  re) {...../* Sig
224a0 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ned data too lar
224b0 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59  ge */.....CACKEY
224c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72  _DEBUG_PRINTF("r
224d0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
224e0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73  ER_TOO_SMALL;  s
224f0 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20  igbuflen = %lu, 
22500 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
22510 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  = %lu", (unsigne
22520 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65  d long) sigbufle
22530 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
22540 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  g) *pulSignature
22550 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61  Len);......retva
22560 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
22570 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74  OO_SMALL;......t
22580 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
22590 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  0;....} else {..
225a0 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
225b0 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28  n = 0;......if (
225c0 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
225d0 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61  ...memcpy(pSigna
225e0 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69  ture, sigbuf, si
225f0 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  gbuflen);.......
22600 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
22610 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a   1;.....}......*
22620 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
22630 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09  = sigbuflen;....
22640 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
22650 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
22660 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48  k;...case CKM_SH
22670 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  A1_RSA_PKCS:....
22680 2f 2a 20 58 58 58 3a 20 41 63 63 75 6d 75 6c 61  /* XXX: Accumula
22690 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68  te into a SHA1 h
226a0 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ash */....cackey
226b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
226c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
226d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
226e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
226f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
22700 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
22710 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
22720 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22730 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
22740 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22750 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61  PORTED);....brea
22760 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  k;..}...if (term
22770 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09  inate_sign) {...
22780 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
22790 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
227a0 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65  gn_buf) {....fre
227b0 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
227c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
227d0 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _buf);...}....ca
227e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
227f0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
22800 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ive = 0;..}...mu
22810 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
22820 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22830 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22840 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
22850 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
22860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22870 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
22880 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
22890 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
228a0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
228b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
228c0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
228d0 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
228e0 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
228f0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
22900 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22910 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
22920 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  erInit)(CK_SESSI
22930 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
22940 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
22950 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
22960 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
22970 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
22980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22990 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
229a0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
229b0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
229c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
229d0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
229e0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
229f0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
22a00 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
22a10 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
22a20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22a30 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
22a40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22a50 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
22a60 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22a70 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
22a80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22a90 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
22aa0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
22ab0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
22ac0 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
22ad0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
22ae0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
22af0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
22b00 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
22b10 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
22b20 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
22b30 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
22b40 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
22b50 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
22b60 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
22b70 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
22b80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22b90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22ba0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
22bb0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22bc0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
22bd0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
22be0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22bf0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22c00 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
22c10 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
22c20 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
22c30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22c40 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
22c50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22c60 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
22c70 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22c80 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74  RV, C_VerifyInit
22c90 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
22ca0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
22cb0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
22cc0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
22cd0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
22ce0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
22cf0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
22d00 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
22d10 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
22d20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22d30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22d40 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
22d50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22d60 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
22d70 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
22d80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22d90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22da0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
22db0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
22dc0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
22dd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22de0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
22df0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22e00 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
22e10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22e20 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b  RV, C_Verify)(CK
22e30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
22e40 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
22e50 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
22e60 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
22e70 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
22e80 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
22e90 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
22ea0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
22eb0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
22ec0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
22ed0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
22ee0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22ef0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22f00 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
22f10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22f20 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
22f30 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
22f40 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22f50 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22f60 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
22f70 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
22f80 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
22f90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22fa0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
22fb0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22fc0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
22fd0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22fe0 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61  RV, C_VerifyUpda
22ff0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
23000 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
23010 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
23020 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
23030 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
23040 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
23050 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
23060 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23070 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
23080 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23090 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
230a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
230b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
230c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
230d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
230e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
230f0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
23100 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23110 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
23120 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23130 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
23140 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23150 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
23160 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
23170 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
23180 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  yFinal)(CK_SESSI
23190 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
231a0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
231b0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
231c0 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
231d0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
231e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
231f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
23200 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
23210 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
23220 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23230 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
23240 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
23250 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
23260 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
23270 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
23280 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23290 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
232a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
232b0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
232c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
232d0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
232e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
232f0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
23300 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23310 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52  CK_RV, C_VerifyR
23320 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
23330 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
23340 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
23350 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
23360 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
23370 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
23380 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23390 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
233a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
233b0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
233c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
233d0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
233e0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
233f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
23400 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
23410 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
23420 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23430 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23440 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23450 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
23460 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23470 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
23480 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
23490 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
234a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
234b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
234c0 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43  VerifyRecover)(C
234d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
234e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
234f0 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
23500 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
23510 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42  gnatureLen, CK_B
23520 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
23530 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
23540 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
23550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23560 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
23570 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
23580 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
23590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
235a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
235b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
235c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
235d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
235e0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
235f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23600 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
23610 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23620 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
23630 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23640 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
23650 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23660 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
23670 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
23680 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
23690 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  stEncryptUpdate)
236a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
236b0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
236c0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
236d0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
236e0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
236f0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
23700 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
23710 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
23720 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
23730 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
23740 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
23750 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23760 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23770 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23780 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
23790 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
237a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
237b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
237c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
237d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
237e0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
237f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
23800 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
23810 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
23820 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
23830 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23840 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
23850 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23860 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67  RV, C_DecryptDig
23870 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
23880 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
23890 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
238a0 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
238b0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
238c0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
238d0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
238e0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
238f0 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
23900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23910 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23920 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23930 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23950 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23960 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
23970 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
23980 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
23990 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
239a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
239b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
239c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
239d0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
239e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
239f0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
23a00 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
23a10 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
23a20 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
23a30 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
23a40 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
23a50 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
23a60 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
23a70 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
23a80 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
23a90 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
23aa0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
23ab0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
23ac0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
23ad0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
23ae0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
23af0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
23b00 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
23b10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23b20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23b30 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
23b40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23b50 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
23b60 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
23b70 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
23b80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
23b90 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
23ba0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
23bb0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
23bc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
23bd0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
23be0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23bf0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
23c00 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
23c10 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56  K_RV, C_DecryptV
23c20 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f  erifyUpdate)(CK_
23c30 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
23c40 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
23c50 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
23c60 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
23c70 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
23c80 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
23c90 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
23ca0 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
23cb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23cc0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
23cd0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
23ce0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
23cf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23d00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
23d10 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
23d20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
23d30 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
23d40 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...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 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
23d70 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23d80 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
23d90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23da0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
23db0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
23dc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
23dd0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
23de0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
23df0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43  C_GenerateKey)(C
23e00 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
23e10 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
23e20 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
23e30 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
23e40 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
23e50 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
23e60 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
23e70 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
23e80 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
23e90 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
23ea0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
23eb0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23ec0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23ed0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23ee0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
23ef0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23f00 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23f10 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23f20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23f30 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23f40 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
23f50 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
23f60 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
23f70 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
23f80 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
23f90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23fa0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
23fb0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23fc0 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
23fd0 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f  yPair)(CK_SESSIO
23fe0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
23ff0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
24000 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
24010 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
24020 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c   pPublicKeyTempl
24030 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
24040 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75  PublicKeyAttribu
24050 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52  teCount, CK_ATTR
24060 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61  IBUTE_PTR pPriva
24070 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  teKeyTemplate, C
24080 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74  K_ULONG ulPrivat
24090 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  eKeyAttributeCou
240a0 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
240b0 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69  NDLE_PTR phPubli
240c0 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  cKey, CK_OBJECT_
240d0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69  HANDLE_PTR phPri
240e0 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b  vateKey) {..CACK
240f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24100 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24110 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24120 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24130 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24140 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24150 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24160 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24170 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
24180 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
24190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
241a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
241b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
241c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
241d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
241e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
241f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
24200 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
24210 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24220 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61  ION(CK_RV, C_Wra
24230 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
24240 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
24250 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
24260 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
24270 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
24280 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  hWrappingKey, CK
24290 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
242a0 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
242b0 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
242c0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72  _ULONG_PTR pulWr
242d0 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09  appedKeyLen) {..
242e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
242f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
24300 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
24310 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
24320 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24330 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
24340 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
24350 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
24360 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
24370 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
24380 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24390 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
243a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
243b0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
243c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
243d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
243e0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
243f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
24400 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
24410 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
24420 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53  _UnwrapKey)(CK_S
24430 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24440 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
24450 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
24460 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
24470 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e  ANDLE hUnwrappin
24480 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  gKey, CK_BYTE_PT
24490 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
244a0 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65  K_ULONG ulWrappe
244b0 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52  dKeyLen, CK_ATTR
244c0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
244d0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
244e0 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
244f0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
24500 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
24510 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24520 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
24530 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
24540 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
24550 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24560 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
24570 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
24580 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
24590 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
245a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
245b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
245c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
245d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
245e0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
245f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24600 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
24610 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
24620 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
24630 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24640 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24650 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45  DeriveKey)(CK_SE
24660 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
24670 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
24680 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
24690 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
246a0 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43  NDLE hBaseKey, C
246b0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
246c0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
246d0 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43  ONG ulAttributeC
246e0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
246f0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
24700 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
24710 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24720 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
24730 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
24740 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24750 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24760 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
24770 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24780 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
24790 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
247a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
247b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
247c0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
247d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
247e0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
247f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
24800 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
24810 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24820 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
24830 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
24840 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d  RV, C_SeedRandom
24850 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
24860 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
24870 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c  _BYTE_PTR pSeed,
24880 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64   CK_ULONG ulSeed
24890 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
248a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
248b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
248c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
248d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
248e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
248f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
24900 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
24910 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
24920 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24930 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
24940 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24950 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
24960 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
24970 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
24980 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24990 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
249a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
249b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
249c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
249d0 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
249e0 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53  eRandom)(CK_SESS
249f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
24a00 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
24a10 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b   pRandomData, CK
24a20 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c  _ULONG ulRandomL
24a30 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
24a40 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
24a50 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
24a60 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
24a70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24a80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24a90 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
24aa0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
24ab0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
24ac0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
24ad0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
24ae0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24af0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
24b00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
24b10 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
24b20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
24b30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
24b40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
24b50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44  PORTED);.}../* D
24b60 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69  eprecated Functi
24b70 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  on */.CK_DEFINE_
24b80 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
24b90 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
24ba0 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  tus)(CK_SESSION_
24bb0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
24bc0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
24bd0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
24be0 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
24bf0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24c00 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
24c10 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
24c20 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
24c30 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
24c40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
24c50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
24c60 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
24c70 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
24c80 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
24c90 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
24ca0 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63   */.}../* Deprec
24cb0 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
24cc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24cd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e  ION(CK_RV, C_Can
24ce0 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f  celFunction)(CK_
24cf0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
24d00 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
24d10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24d20 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
24d30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24d40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
24d50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
24d60 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
24d70 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
24d80 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
24d90 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
24da0 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
24db0 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
24dc0 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
24dd0 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
24de0 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43   warning */.}..C
24df0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
24e00 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
24e10 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46  nctionList)(CK_F
24e20 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
24e30 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c  _PTR ppFunctionL
24e40 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54  ist) {..CK_FUNCT
24e50 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75  ION_LIST_PTR pFu
24e60 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
24e70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24e80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24e90 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69  if (ppFunctionLi
24ea0 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
24eb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24ec0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75  NTF("Error. ppFu
24ed0 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55  nctionList is NU
24ee0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
24ef0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
24f00 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74  AD);..}...pFunct
24f10 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63  ionList = malloc
24f20 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69  (sizeof(*pFuncti
24f30 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e  onList));...pFun
24f40 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
24f50 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
24f60 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
24f70 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
24f80 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63  ) & 0xff;..pFunc
24f90 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f  tionList->versio
24fa0 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
24fb0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
24fc0 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
24fd0 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74  & 0xff;...pFunct
24fe0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69  ionList->C_Initi
24ff0 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61  alize = C_Initia
25000 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  lize;..pFunction
25010 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65  List->C_Finalize
25020 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09   = C_Finalize;..
25030 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
25040 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74  _GetInfo = C_Get
25050 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
25060 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c  List->C_GetSlotL
25070 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c  ist = C_GetSlotL
25080 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ist;..pFunctionL
25090 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e  ist->C_GetSlotIn
250a0 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e  fo = C_GetSlotIn
250b0 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
250c0 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  st->C_GetTokenIn
250d0 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49  fo = C_GetTokenI
250e0 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
250f0 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c  ist->C_WaitForSl
25100 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74  otEvent = C_Wait
25110 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70  ForSlotEvent;..p
25120 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
25130 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
25140 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73   = C_GetMechanis
25150 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  mList;..pFunctio
25160 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68  nList->C_GetMech
25170 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65  anismInfo = C_Ge
25180 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a  tMechanismInfo;.
25190 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
251a0 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f  C_InitToken = C_
251b0 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e  InitToken;..pFun
251c0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
251d0 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e  tPIN = C_InitPIN
251e0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
251f0 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53  ->C_SetPIN = C_S
25200 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f  etPIN;..pFunctio
25210 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73  nList->C_OpenSes
25220 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73  sion = C_OpenSes
25230 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  sion;..pFunction
25240 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73  List->C_CloseSes
25250 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65  sion = C_CloseSe
25260 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
25270 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c  nList->C_CloseAl
25280 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c  lSessions = C_Cl
25290 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a  oseAllSessions;.
252a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
252b0 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
252c0 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49   = C_GetSessionI
252d0 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
252e0 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74  ist->C_GetOperat
252f0 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74  ionState = C_Get
25300 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a  OperationState;.
25310 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
25320 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
25330 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61  ate = C_SetOpera
25340 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e  tionState;..pFun
25350 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67  ctionList->C_Log
25360 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70  in = C_Login;..p
25370 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
25380 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75  Logout = C_Logou
25390 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
253a0 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  t->C_CreateObjec
253b0 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65  t = C_CreateObje
253c0 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
253d0 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74  st->C_CopyObject
253e0 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b   = C_CopyObject;
253f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
25400 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74  >C_DestroyObject
25410 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65   = C_DestroyObje
25420 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
25430 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53  st->C_GetObjectS
25440 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63  ize = C_GetObjec
25450 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  tSize;..pFunctio
25460 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72  nList->C_GetAttr
25470 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47  ibuteValue = C_G
25480 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
25490 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
254a0 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  ->C_SetAttribute
254b0 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74  Value = C_SetAtt
254c0 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46  ributeValue;..pF
254d0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
254e0 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d  indObjectsInit =
254f0 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e   C_FindObjectsIn
25500 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
25510 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
25520 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  s = C_FindObject
25530 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
25540 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
25550 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62  Final = C_FindOb
25560 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75  jectsFinal;..pFu
25570 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
25580 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e  cryptInit = C_En
25590 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e  cryptInit;..pFun
255a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
255b0 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74  rypt = C_Encrypt
255c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
255d0 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  ->C_EncryptUpdat
255e0 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64  e = C_EncryptUpd
255f0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
25600 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69  ist->C_EncryptFi
25610 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46  nal = C_EncryptF
25620 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
25630 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49  List->C_DecryptI
25640 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49  nit = C_DecryptI
25650 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
25660 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d  ist->C_Decrypt =
25670 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75   C_Decrypt;..pFu
25680 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
25690 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
256a0 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  DecryptUpdate;..
256b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
256c0 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20  _DecryptFinal = 
256d0 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a  C_DecryptFinal;.
256e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
256f0 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43  C_DigestInit = C
25700 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46  _DigestInit;..pF
25710 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
25720 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74  igest = C_Digest
25730 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
25740 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74 65  ->C_DigestUpdate
25750 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61 74   = C_DigestUpdat
25760 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
25770 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d  t->C_DigestKey =
25780 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70   C_DigestKey;..p
25790 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
257a0 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f  DigestFinal = C_
257b0 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46  DigestFinal;..pF
257c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
257d0 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e  ignInit = C_Sign
257e0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
257f0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43  List->C_Sign = C
25800 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  _Sign;..pFunctio
25810 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64  nList->C_SignUpd
25820 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ate = C_SignUpda
25830 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
25840 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20  st->C_SignFinal 
25850 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09  = C_SignFinal;..
25860 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
25870 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
25880 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72   = C_SignRecover
25890 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
258a0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f  List->C_SignReco
258b0 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f  ver = C_SignReco
258c0 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
258d0 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69  ist->C_VerifyIni
258e0 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74  t = C_VerifyInit
258f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
25900 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56  ->C_Verify = C_V
25910 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f  erify;..pFunctio
25920 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55  nList->C_VerifyU
25930 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79  pdate = C_Verify
25940 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
25950 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
25960 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79  Final = C_Verify
25970 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
25980 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52  nList->C_VerifyR
25990 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56  ecoverInit = C_V
259a0 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74  erifyRecoverInit
259b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
259c0 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  ->C_VerifyRecove
259d0 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f  r = C_VerifyReco
259e0 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
259f0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63  ist->C_DigestEnc
25a00 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44  ryptUpdate = C_D
25a10 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
25a20 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
25a30 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67  st->C_DecryptDig
25a40 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65  estUpdate = C_De
25a50 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
25a60 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
25a70 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74  t->C_SignEncrypt
25a80 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45  Update = C_SignE
25a90 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
25aa0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
25ab0 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
25ac0 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56  ate = C_DecryptV
25ad0 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46  erifyUpdate;..pF
25ae0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
25af0 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47  enerateKey = C_G
25b00 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75  enerateKey;..pFu
25b10 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
25b20 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20  nerateKeyPair = 
25b30 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
25b40 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
25b50 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43  t->C_WrapKey = C
25b60 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63  _WrapKey;..pFunc
25b70 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72  tionList->C_Unwr
25b80 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70  apKey = C_Unwrap
25b90 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
25ba0 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79  ist->C_DeriveKey
25bb0 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a   = C_DeriveKey;.
25bc0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
25bd0 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43  C_SeedRandom = C
25be0 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46  _SeedRandom;..pF
25bf0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
25c00 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20  enerateRandom = 
25c10 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
25c20 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
25c30 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  ->C_GetFunctionS
25c40 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e  tatus = C_GetFun
25c50 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46  ctionStatus;..pF
25c60 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
25c70 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20  ancelFunction = 
25c80 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
25c90 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
25ca0 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  ->C_GetFunctionL
25cb0 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74  ist = C_GetFunct
25cc0 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75  ionList;...*ppFu
25cd0 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75  nctionList = pFu
25ce0 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
25cf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25d00 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
25d10 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
25d20 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
25d30 5f 4f 4b 29 3b 0a 7d 0a 0a                       _OK);.}..