Hex Artifact Content

Artifact 9bef8e63038f71cf4ced9779abd20d6d44ebae56:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 43 53  .#ifdef HAVE_PCS
0040: 43 4c 49 54 45 5f 48 0a 23 20 20 69 6e 63 6c 75  CLITE_H.#  inclu
0050: 64 65 20 3c 70 63 73 63 6c 69 74 65 2e 68 3e 0a  de <pcsclite.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 57 49 4e 53 43 41 52 44 5f 48 0a 23 20  VE_WINSCARD_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 73 63 61   include <winsca
0090: 72 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  rd.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 53 54 44 49 4e 54 5f  def HAVE_STDINT_
00b0: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74  H.#  include <st
00c0: 64 69 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  dint.h>.#endif.#
00d0: 69 66 64 65 66 20 48 41 56 45 5f 49 4e 54 54 59  ifdef HAVE_INTTY
00e0: 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65  PES_H.#  include
00f0: 20 3c 69 6e 74 74 79 70 65 73 2e 68 3e 0a 23 65   <inttypes.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 53 54 44 4c 49 42 5f 48 0a 23 20 20 69 6e 63  _STDLIB_H.#  inc
0120: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0130: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0140: 56 45 5f 55 4e 49 53 54 44 5f 48 0a 23 20 20 69  VE_UNISTD_H.#  i
0150: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0160: 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  >.#endif.#ifdef 
0170: 48 41 56 45 5f 53 54 52 49 4e 47 5f 48 0a 23 20  HAVE_STRING_H.# 
0180: 20 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67   include <string
0190: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
01a0: 66 20 48 41 56 45 5f 50 54 48 52 45 41 44 5f 48  f HAVE_PTHREAD_H
01b0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 74 68  .#  include <pth
01c0: 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  read.h>.#endif.#
01d0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 4d 49 54  ifdef HAVE_LIMIT
01e0: 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  S_H.#  include <
01f0: 6c 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66  limits.h>.#endif
0200: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 5a 4c 49  .#ifdef HAVE_ZLI
0210: 42 5f 48 0a 23 20 20 69 66 64 65 66 20 48 41 56  B_H.#  ifdef HAV
0220: 45 5f 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c  E_LIBZ.#    incl
0230: 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20  ude <zlib.h>.#  
0240: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69  endif.#else.#  i
0250: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23  fdef HAVE_LIBZ.#
0260: 20 20 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c      undef HAVE_L
0270: 49 42 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  IBZ.#  endif.#en
0280: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f  dif..#define CK_
0290: 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b  PTR *.#define CK
02a0: 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
02b0: 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d  (returnType, nam
02c0: 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61  e) returnType na
02d0: 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45  me.#define CK_DE
02e0: 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72  CLARE_FUNCTION(r
02f0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
0300: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65   returnType name
0310: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c  .#define CK_DECL
0320: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49  ARE_FUNCTION_POI
0330: 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c  NTER(returnType,
0340: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0350: 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69  e (* name).#defi
0360: 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46  ne CK_CALLBACK_F
0370: 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79  UNCTION(returnTy
0380: 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e  pe, name) return
0390: 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69  Type (* name).#i
03a0: 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23  fndef NULL_PTR.#
03b0: 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54    define NULL_PT
03c0: 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63  R 0.#endif..#inc
03d0: 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a  lude "pkcs11.h".
03e0: 23 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78  #include "asn1-x
03f0: 35 30 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20  509.h"..#ifndef 
0400: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0410: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20  VERSION_CODE.#  
0420: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52  define CACKEY_CR
0430: 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
0440: 4f 44 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e  ODE 0x021e00.#en
0450: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41  dif..#ifndef CKA
0460: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
0470: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
0480: 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
0490: 54 48 20 30 78 63 65 35 33 36 33 35 38 0a 23 65  TH 0xce536358.#e
04a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
04b0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04c0: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41  TH.#  define CKA
04d0: 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
04e0: 54 48 20 30 78 63 65 35 33 36 33 35 39 0a 23 65  TH 0xce536359.#e
04f0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
0500: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
0510: 49 4e 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b  ING.#  define CK
0520: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
0530: 4e 49 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a  NING 0xce53635a.
0540: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43  #endif.#ifndef C
0550: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
0560: 52 4f 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66  ROTECTION.#  def
0570: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ine CKA_TRUST_EM
0580: 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30  AIL_PROTECTION 0
0590: 78 63 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66  xce53635b.#endif
05a0: 0a 0a 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31  ../* GSC-IS v2.1
05b0: 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a   Definitions */.
05c0: 2f 2a 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a  /** Classes **/.
05d0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c  #define GSCIS_CL
05e0: 41 53 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20  ASS_ISO7816     
05f0: 20 20 20 20 20 20 30 78 30 30 0a 23 64 65 66 69        0x00.#defi
0600: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  ne GSCIS_CLASS_G
0610: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20  LOBAL_PLATFORM  
0620: 20 30 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72   0x80../** Instr
0630: 75 63 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66  uctions **/.#def
0640: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0650: 47 45 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20  GET_RESPONSE    
0660: 20 20 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47    0xC0.#define G
0670: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
0680: 42 49 4e 41 52 59 20 20 20 20 20 20 20 30 78 42  BINARY       0xB
0690: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06a0: 49 4e 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e  INSTR_UPDATE_BIN
06b0: 41 52 59 20 20 20 20 20 30 78 44 36 0a 23 64 65  ARY     0xD6.#de
06c0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
06d0: 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20 20 20  _SELECT         
06e0: 20 20 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20     0xA4.#define 
06f0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45  GSCIS_INSTR_EXTE
0700: 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78  RNAL_AUTH     0x
0710: 38 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  82.#define GSCIS
0720: 5f 49 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c  _INSTR_GET_CHALL
0730: 45 4e 47 45 20 20 20 20 20 30 78 38 34 0a 23 64  ENGE     0x84.#d
0740: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0750: 52 5f 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20  R_INTERNAL_AUTH 
0760: 20 20 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65      0x88.#define
0770: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
0780: 49 46 59 20 20 20 20 20 20 20 20 20 20 20 20 30  IFY            0
0790: 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x20.#define GSCI
07a0: 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20  S_INSTR_SIGN    
07b0: 20 20 20 20 20 20 20 20 20 20 30 78 32 41 0a 23            0x2A.#
07c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
07d0: 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20  TR_GET_PROP     
07e0: 20 20 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e       0x56.#defin
07f0: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0800: 54 5f 41 43 52 20 20 20 20 20 20 20 20 20 20 20  T_ACR           
0810: 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43  0x4C.#define GSC
0820: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
0830: 46 46 45 52 20 20 20 20 20 20 20 30 78 35 32 0a  FFER       0x52.
0840: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0850: 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20  STR_SIGNDECRYPT 
0860: 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66        0x42..#def
0870: 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f  ine GSCIS_PARAM_
0880: 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20  SELECT_APPLET   
0890: 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73    0x04../** Tags
08a0: 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61   **/./*** CCC Ta
08b0: 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  gs ***/.#define 
08c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
08e0: 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  F0.#define GSCIS
08f0: 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20  _TAG_CCC_VER    
0900: 20 20 20 20 20 20 20 20 20 30 78 46 31 0a 23 64           0xF1.#d
0910: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0920: 43 43 47 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCG_VER         
0930: 20 20 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65      0xF2.#define
0940: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
0950: 52 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  RL             0
0960: 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF3.#define GSCI
0970: 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20  S_TAG_PKCS15    
0980: 20 20 20 20 20 20 20 20 20 20 30 78 46 34 0a 23            0xF4.#
0990: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09a0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20  _REG_DATA_MODEL 
09b0: 20 20 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e       0xF5.#defin
09c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
09d0: 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20  TABLE           
09e0: 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF6.#define GSC
09f0: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55  IS_TAG_CARD_APDU
0a00: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 37 0a             0xF7.
0a10: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a20: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20  G_REDIRECTION   
0a30: 20 20 20 20 20 20 30 78 46 41 0a 23 64 65 66 69        0xFA.#defi
0a40: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20  ne GSCIS_TAG_CT 
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53   0xFB.#define GS
0a70: 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20  CIS_TAG_ST      
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 43              0xFC
0a90: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0aa0: 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20  AG_NEXTCCC      
0ab0: 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a         0xFD../**
0ac0: 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32  * General - EF 2
0ad0: 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  200 ***/.#define
0ae0: 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45   GSCIS_TAG_FNAME
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0b00: 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x01.#define GSCI
0b10: 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20  S_TAG_MNAME     
0b20: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 0a 23            0x02.#
0b30: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b40: 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _LNAME          
0b50: 20 20 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e       0x03.#defin
0b60: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46  e GSCIS_TAG_SUFF
0b70: 49 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  IX              
0b80: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x04.#define GSC
0b90: 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e  IS_TAG_GOVT_AGEN
0ba0: 43 59 20 20 20 20 20 20 20 20 20 30 78 30 35 0a  CY         0x05.
0bb0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0bc0: 47 5f 42 55 52 45 41 55 20 20 20 20 20 20 20 20  G_BUREAU        
0bd0: 20 20 20 20 20 20 30 78 30 36 0a 23 64 65 66 69        0x06.#defi
0be0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0bf0: 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EAU_CODE        
0c00: 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53   0x07.#define GS
0c10: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
0c20: 45 20 20 20 20 20 20 20 20 20 20 20 30 78 30 38  E           0x08
0c30: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c40: 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20  AG_TITLE        
0c50: 20 20 20 20 20 20 20 30 78 30 39 0a 23 64 65 66         0x09.#def
0c60: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ine GSCIS_TAG_BU
0c70: 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20 20 20  ILDING          
0c80: 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47    0x10.#define G
0c90: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
0ca0: 41 44 44 52 31 20 20 20 20 20 20 20 20 30 78 31  ADDR1        0x1
0cb0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
0cc0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32  TAG_OFFICE_ADDR2
0cd0: 20 20 20 20 20 20 20 20 30 78 31 32 0a 23 64 65          0x12.#de
0ce0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0cf0: 46 46 49 43 45 5f 43 49 54 59 20 20 20 20 20 20  FFICE_CITY      
0d00: 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20     0x13.#define 
0d10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d20: 5f 53 54 41 54 45 20 20 20 20 20 20 20 20 30 78  _STATE        0x
0d30: 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  14.#define GSCIS
0d40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20  _TAG_OFFICE_ZIP 
0d50: 20 20 20 20 20 20 20 20 20 30 78 31 35 0a 23 64           0x15.#d
0d60: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0d70: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20  OFFICE_COUNTRY  
0d80: 20 20 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65      0x16.#define
0d90: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0da0: 45 5f 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30  E_PHONE        0
0db0: 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x17.#define GSCI
0dc0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0dd0: 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23  NE_EXT    0x18.#
0de0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0df0: 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20 20 20  _OFFICE_FAX     
0e00: 20 20 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e       0x19.#defin
0e10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e20: 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20  CE_EMAIL        
0e30: 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43  0x1A.#define GSC
0e40: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
0e50: 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31 42 0a  OM         0x1B.
0e60: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0e70: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20  G_NONGOV_AGENCY 
0e80: 20 20 20 20 20 20 30 78 31 43 0a 23 64 65 66 69        0x1C.#defi
0e90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  ne GSCIS_TAG_SSN
0ea0: 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20  _DESIGNATOR     
0eb0: 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20   0x1D../*** PII 
0ec0: 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23  - EF 2100 ***/.#
0ed0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0ee0: 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20 20 20  _SSN            
0ef0: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e       0x20.#defin
0f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20  e GSCIS_TAG_DOB 
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0x21.#define GSC
0f30: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20  IS_TAG_GENDER   
0f40: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 32 0a             0x22.
0f50: 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f  ./*** Login Info
0f60: 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30  rmation - EF 400
0f70: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
0f80: 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20  SCIS_TAG_USERID 
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 34               0x4
0fa0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0fb0: 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20  TAG_DOMAIN      
0fc0: 20 20 20 20 20 20 20 20 30 78 34 31 0a 23 64 65          0x41.#de
0fd0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50  fine GSCIS_TAG_P
0fe0: 41 53 53 57 4f 52 44 20 20 20 20 20 20 20 20 20  ASSWORD         
0ff0: 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61     0x42../*** Ca
1000: 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  rd Information -
1010: 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 5000 ***/.#d
1020: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1030: 49 53 53 55 45 52 49 44 20 20 20 20 20 20 20 20  ISSUERID        
1040: 20 20 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65      0x50.#define
1050: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f   GSCIS_TAG_SERNO
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1070: 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x51.#define GSCI
1080: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
1090: 20 20 20 20 20 20 20 20 20 20 30 78 35 32 0a 23            0x52.#
10a0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10b0: 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20 20 20  _EXPIRE_DATE    
10c0: 20 20 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e       0x53.#defin
10d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
10e0: 5f 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20  _TYPE           
10f0: 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x54.#define GSC
1100: 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f  IS_TAG_SECURITY_
1110: 43 4f 44 45 20 20 20 20 20 20 20 30 78 35 37 0a  CODE       0x57.
1120: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1130: 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20 20 20  G_CARDID_AID    
1140: 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a        0x58../***
1150: 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e   PKI Information
1160: 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a   - EF 7000 ***/.
1170: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1180: 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 20 20  G_CERTIFICATE   
1190: 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 66 69        0x70.#defi
11a0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  ne GSCIS_TAG_CER
11b0: 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20  T_ISSUE_DATE    
11c0: 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53   0x71.#define GS
11d0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
11e0: 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 37 32  IRE_DATE    0x72
11f0: 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73  ../** Applet IDs
1200: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43   **/.#define GSC
1210: 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20  IS_AID_CCC      
1220: 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 2c             0xA0,
1230: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1240: 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30  1, 0x16, 0xDB, 0
1250: 78 30 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  x00..#ifdef CACK
1260: 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66 64 65  EY_DEBUG.#  ifde
1270: 66 20 48 41 56 45 5f 53 54 44 49 4f 5f 48 0a 23  f HAVE_STDIO_H.#
1280: 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64      include <std
1290: 69 6f 2e 68 3e 0a 23 20 20 65 6e 64 69 66 0a 0a  io.h>.#  endif..
12a0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
12b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
12c0: 2e 2e 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74  ..) { fprintf(st
12d0: 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20  derr, "%s():%i: 
12e0: 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  ", __func__, __L
12f0: 49 4e 45 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28  INE__); fprintf(
1300: 73 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72 69  stderr, x); fpri
1310: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
1320: 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43  ); }.#  define C
1330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1340: 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 7b 20  TBUF(f, x, y) { 
1350: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1360: 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65 64 20  MPBUF; unsigned 
1370: 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42 55 46  long idx; TMPBUF
1380: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
1390: 72 20 2a 29 20 28 78 29 3b 20 66 70 72 69 6e 74  r *) (x); fprint
13a0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a  f(stderr, "%s():
13b0: 25 69 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20  %i: %s  (%s/%lu 
13c0: 3d 20 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63  = {%02x", __func
13d0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c  __, __LINE__, f,
13e0: 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c   #x, (unsigned l
13f0: 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46  ong) (y), TMPBUF
1400: 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d  [0]); for (idx =
1410: 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69   1; idx < (y); i
1420: 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28  dx++) { fprintf(
1430: 73 74 64 65 72 72 2c 20 22 2c 20 25 30 32 78 22  stderr, ", %02x"
1440: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20  , TMPBUF[idx]); 
1450: 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  }; fprintf(stder
1460: 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 7d 0a 23 20  r, "})\n"); }.# 
1470: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
1480: 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b  EBUG_PERROR(x) {
1490: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14a0: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f   "%s():%i: ", __
14b0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
14c0: 29 3b 20 70 65 72 72 6f 72 28 78 29 3b 20 7d 0a  ); perror(x); }.
14d0: 23 20 20 64 65 66 69 6e 65 20 66 72 65 65 28 78  #  define free(x
14e0: 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ) { CACKEY_DEBUG
14f0: 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28 25 70  _PRINTF("FREE(%p
1500: 29 20 28 25 73 29 22 2c 20 78 2c 20 23 78 29 3b  ) (%s)", x, #x);
1510: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1520: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59  tic void *CACKEY
1530: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
1540: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  OC(size_t size, 
1550: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
1560: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
1570: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
1580: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  etval = malloc(s
1590: 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ize);...fprintf(
15a0: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69  stderr, "%s():%i
15b0: 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29  : ", func, line)
15c0: 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
15d0: 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  r, "MALLOC() = %
15e0: 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70  p", retval);..fp
15f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1600: 6e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  n");...return(re
1610: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
1620: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
1630: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
1640: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65  (void *ptr, size
1650: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
1660: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
1670: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
1680: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
1690: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69   realloc(ptr, si
16a0: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  ze);...if (retva
16b0: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70  l != ptr) {...fp
16c0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
16d0: 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c  s():%i: ", func,
16e0: 20 6c 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e 74   line);...fprint
16f0: 66 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c 4c  f(stderr, "REALL
1700: 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70 74  OC(%p) = %p", pt
1710: 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 70  r, retval);...fp
1720: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
1730: 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  n");..}...return
1740: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
1750: 74 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59  tic char *CACKEY
1760: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44  _DEBUG_FUNC_STRD
1770: 55 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  UP(const char *p
1780: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
1790: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
17a0: 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b  {..char *retval;
17b0: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64  ...retval = strd
17c0: 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e  up(ptr);...fprin
17d0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
17e0: 3a 25 69 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69  :%i: ", func, li
17f0: 6e 65 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  ne);..fprintf(st
1800: 64 65 72 72 2c 20 22 53 54 52 44 55 50 5f 4d 41  derr, "STRDUP_MA
1810: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
1820: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
1830: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 0a  stderr, "\n");..
1840: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1850: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
1860: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
1870: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
1880: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61  STR(unsigned cha
1890: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68  r tag) {..switch
18a0: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20   (tag) {...case 
18b0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
18c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
18d0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b  IS_TAG_CARDID");
18e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
18f0: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65  G_CCC_VER:....re
1900: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1910: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73  CCC_VER");...cas
1920: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
1930: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
1940: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
1950: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
1960: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
1970: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1980: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09  TAG_CARDURL");..
1990: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
19a0: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72  PKCS15:....retur
19b0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  n("GSCIS_TAG_PKC
19c0: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53  S15");...case GS
19d0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
19e0: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72  _MODEL:....retur
19f0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47  n("GSCIS_TAG_REG
1a00: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09  _DATA_MODEL");..
1a10: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1a20: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65  ACR_TABLE:....re
1a30: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1a40: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63  ACR_TABLE");...c
1a50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
1a60: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75  RD_APDU:....retu
1a70: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
1a80: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73  RD_APDU");...cas
1a90: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  e GSCIS_TAG_REDI
1aa0: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  RECTION:....retu
1ab0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
1ac0: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63  DIRECTION");...c
1ad0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ase GSCIS_TAG_CT
1ae0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1af0: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63  IS_TAG_CT");...c
1b00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ase GSCIS_TAG_ST
1b10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1b20: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63  IS_TAG_ST");...c
1b30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ase GSCIS_TAG_NE
1b40: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e  XTCCC:....return
1b50: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  ("GSCIS_TAG_NEXT
1b60: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53  CCC");...case GS
1b70: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09  CIS_TAG_FNAME:..
1b80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1b90: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_FNAME");...c
1ba0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e  ase GSCIS_TAG_MN
1bb0: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
1bc0: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22  GSCIS_TAG_MNAME"
1bd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1be0: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_LNAME:....re
1bf0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1c00: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  LNAME");...case 
1c10: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
1c20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1c30: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b  IS_TAG_SUFFIX");
1c40: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1c50: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09  G_GOVT_AGENCY:..
1c60: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1c70: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22  TAG_GOVT_AGENCY"
1c80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1c90: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72  TAG_BUREAU:....r
1ca0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1cb0: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73  _BUREAU");...cas
1cc0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
1cd0: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  AU_CODE:....retu
1ce0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
1cf0: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63  REAU_CODE");...c
1d00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ase GSCIS_TAG_DE
1d10: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  PT_CODE:....retu
1d20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45  rn("GSCIS_TAG_DE
1d30: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  PT_CODE");...cas
1d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  e GSCIS_TAG_TITL
1d50: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1d60: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b  CIS_TAG_TITLE");
1d70: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d80: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72  G_BUILDING:....r
1d90: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1da0: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63  _BUILDING");...c
1db0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
1dc0: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72  FICE_ADDR1:....r
1dd0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1de0: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b  _OFFICE_ADDR1");
1df0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1e00: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a  G_OFFICE_ADDR2:.
1e10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e20: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
1e30: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  2");...case GSCI
1e40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
1e50: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
1e60: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
1e70: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ITY");...case GS
1e80: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
1e90: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TATE:....return(
1ea0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1eb0: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73  E_STATE");...cas
1ec0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1ed0: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72  CE_ZIP:....retur
1ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
1ef0: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73  ICE_ZIP");...cas
1f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1f10: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72  CE_COUNTRY:....r
1f20: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1f30: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22  _OFFICE_COUNTRY"
1f40: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1f50: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
1f60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1f70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
1f80: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ONE");...case GS
1f90: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
1fa0: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74  HONE_EXT:....ret
1fb0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1fc0: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22  FFICE_PHONE_EXT"
1fd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1fe0: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a  TAG_OFFICE_FAX:.
1ff0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2000: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22  _TAG_OFFICE_FAX"
2010: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2020: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2030: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2040: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
2050: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIL");...case GS
2060: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2070: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OOM:....return("
2080: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2090: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20  _ROOM");...case 
20a0: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
20b0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
20c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f  rn("GSCIS_TAG_NO
20d0: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09  NGOV_AGENCY");..
20e0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
20f0: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a  SSN_DESIGNATOR:.
2100: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2110: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2120: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TOR");...case GS
2130: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09  CIS_TAG_SSN:....
2140: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2150: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20  G_SSN");...case 
2160: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09  GSCIS_TAG_DOB:..
2170: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2180: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73  TAG_DOB");...cas
2190: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  e GSCIS_TAG_GEND
21a0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
21b0: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22  SCIS_TAG_GENDER"
21c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
21d0: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72  TAG_USERID:....r
21e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
21f0: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73  _USERID");...cas
2200: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  e GSCIS_TAG_DOMA
2210: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IN:....return("G
2220: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22  SCIS_TAG_DOMAIN"
2230: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2240: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09  TAG_PASSWORD:...
2250: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2260: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09  AG_PASSWORD");..
2270: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2280: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74  ISSUERID:....ret
2290: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
22a0: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73  SSUERID");...cas
22b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
22c0: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  O:....return("GS
22d0: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b  CIS_TAG_SERNO");
22e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
22f0: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  G_ISSUE_DATE:...
2300: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2310: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  AG_ISSUE_DATE");
2320: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2330: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  G_EXPIRE_DATE:..
2340: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2350: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22  TAG_EXPIRE_DATE"
2360: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2370: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09  TAG_CARD_TYPE:..
2380: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2390: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b  TAG_CARD_TYPE");
23a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
23b0: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a  G_SECURITY_CODE:
23c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
23d0: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
23e0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
23f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
2400: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2410: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
2420: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AID");...case GS
2430: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
2440: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2450: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
2460: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  ICATE");...case 
2470: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
2480: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
2490: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
24a0: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22  CERT_ISSUE_DATE"
24b0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
24c0: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
24d0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
24e0: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
24f0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
2500: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
2510: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
2520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
2530: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
2540: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c  CARDERR_TO_STR(L
2550: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09  ONG retcode) {..
2560: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29  switch (retcode)
2570: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
2580: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65  S_SUCCESS:....re
2590: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55  turn("SCARD_S_SU
25a0: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CCESS");...case 
25b0: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45  SCARD_E_CANCELLE
25c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
25d0: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22  ARD_E_CANCELLED"
25e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
25f0: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a  E_CANT_DISPOSE:.
2600: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2610: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22  _E_CANT_DISPOSE"
2620: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2630: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
2640: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UFFER:....return
2650: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  ("SCARD_E_INSUFF
2660: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b  ICIENT_BUFFER");
2670: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2680: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09  INVALID_ATR:....
2690: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
26a0: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09  INVALID_ATR");..
26b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
26c0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09  VALID_HANDLE:...
26d0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
26e0: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22  _INVALID_HANDLE"
26f0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2700: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
2710: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TER:....return("
2720: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2730: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63  PARAMETER");...c
2740: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
2750: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72  LID_TARGET:....r
2760: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
2770: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b  NVALID_TARGET");
2780: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2790: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09  INVALID_VALUE:..
27a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
27b0: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22  E_INVALID_VALUE"
27c0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
27d0: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09  E_NO_MEMORY:....
27e0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
27f0: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63  NO_MEMORY");...c
2800: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
2810: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  OWN_READER:....r
2820: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
2830: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b  NKNOWN_READER");
2840: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2850: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75  TIMEOUT:....retu
2860: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45  rn("SCARD_E_TIME
2870: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OUT");...case SC
2880: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
2890: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  OLATION:....retu
28a0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52  rn("SCARD_E_SHAR
28b0: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b  ING_VIOLATION");
28c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
28d0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09  NO_SMARTCARD:...
28e0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
28f0: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b  _NO_SMARTCARD");
2900: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2910: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09  UNKNOWN_CARD:...
2920: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2930: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b  _UNKNOWN_CARD");
2940: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2950: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a  PROTO_MISMATCH:.
2960: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2970: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
2980: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  H");...case SCAR
2990: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09  D_E_NOT_READY:..
29a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
29b0: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09  E_NOT_READY");..
29c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59  .case SCARD_E_SY
29d0: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  STEM_CANCELLED:.
29e0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
29f0: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
2a00: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
2a10: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
2a20: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CTED:....return(
2a30: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41  "SCARD_E_NOT_TRA
2a40: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73  NSACTED");...cas
2a50: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
2a60: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  _UNAVAILABLE:...
2a70: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2a80: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
2a90: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  BLE");...case SC
2aa0: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
2ab0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
2ac0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  n("SCARD_W_UNSUP
2ad0: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  PORTED_CARD");..
2ae0: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
2af0: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a  RESPONSIVE_CARD:
2b00: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2b10: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45  D_W_UNRESPONSIVE
2b20: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2b30: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
2b40: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
2b50: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  n("SCARD_W_UNPOW
2b60: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  ERED_CARD");...c
2b70: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45  ase SCARD_W_RESE
2b80: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  T_CARD:....retur
2b90: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54  n("SCARD_W_RESET
2ba0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2bb0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
2bc0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
2bd0: 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44  "SCARD_W_REMOVED
2be0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2bf0: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
2c00: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e  SMALL:....return
2c10: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f  ("SCARD_E_PCI_TO
2c20: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73  O_SMALL");...cas
2c30: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
2c40: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
2c50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2c60: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
2c70: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
2c80: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
2c90: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
2ca0: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  n("SCARD_E_DUPLI
2cb0: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09  CATE_READER");..
2cc0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
2cd0: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a  RD_UNSUPPORTED:.
2ce0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2cf0: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
2d00: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
2d10: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
2d20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2d30: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22  RD_E_NO_SERVICE"
2d40: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2d50: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
2d60: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
2d70: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
2d80: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20  OPPED");...case 
2d90: 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44  SCARD_W_INSERTED
2da0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
2db0: 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  ("SCARD_W_INSERT
2dc0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
2dd0: 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50  e SCARD_E_UNSUPP
2de0: 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09  ORTED_FEATURE:..
2df0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2e00: 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45  E_UNSUPPORTED_FE
2e10: 41 54 55 52 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  ATURE");..}...re
2e20: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
2e30: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
2e40: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
2e50: 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
2e60: 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f  O_STR(uint16_t o
2e70: 62 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20  bjid) {..switch 
2e80: 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65  (objid) {...case
2e90: 20 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75   0x2000:....retu
2ea0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
2eb0: 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f  BJID_GENERALINFO
2ec0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30  ");...case 0x210
2ed0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
2ee0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50  CKEY_TLV_OBJID_P
2ef0: 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29  ROPERSONALINFO")
2f00: 3b 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a  ;...case 0x3000:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2f20: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43  EY_TLV_OBJID_ACC
2f30: 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09  ESSCONTROL");...
2f40: 63 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09  case 0x4000:....
2f50: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
2f60: 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29  LV_OBJID_LOGIN")
2f70: 3b 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a  ;...case 0x5000:
2f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2f90: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52  EY_TLV_OBJID_CAR
2fa0: 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20  DINFO");...case 
2fb0: 30 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x6000:....retur
2fc0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2fd0: 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29  JID_BIOMETRICS")
2fe0: 3b 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a  ;...case 0x7000:
2ff0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3000: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47  EY_TLV_OBJID_DIG
3010: 49 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09  ITALSIGCERT");..
3020: 09 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09  .case 0x0200:...
3030: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3040: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
3050: 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30  RSON");...case 0
3060: 78 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e  x0202:....return
3070: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3080: 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22  ID_CAC_BENEFITS"
3090: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33  );...case 0x0203
30a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30b0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
30c0: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22  C_OTHERBENEFITS"
30d0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31  );...case 0x0201
30e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30f0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3100: 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09  C_PERSONNEL");..
3110: 09 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09  .case 0x02FE:...
3120: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3130: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
3140: 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72  ICERT");..}....r
3150: 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29  eturn("UNKNOWN")
3160: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
3170: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
3180: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
3190: 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74  E_TO_STR(uint8_t
31a0: 20 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69   apptype) {..swi
31b0: 74 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a  tch (apptype) {.
31c0: 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09  ..case 0x00:....
31d0: 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a  return("NONE");.
31e0: 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09  ..case 0x01:....
31f0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3200: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29  LV_APP_GENERIC")
3210: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09  ;...case 0x02:..
3220: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3230: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
3240: 09 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09  ..case 0x03:....
3250: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3260: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
3270: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3280: 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SKI");...case 0x
3290: 30 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  04:....return("C
32a0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
32b0: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35  I");...case 0x05
32c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
32d0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45  KEY_TLV_APP_GENE
32e0: 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  RIC | CACKEY_TLV
32f0: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
3300: 73 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75  se 0x06:....retu
3310: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
3320: 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f  PP_SKI | CACKEY_
3330: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
3340: 09 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72  .case 0x07:....r
3350: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3360: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3370: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3380: 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  KI | CACKEY_TLV_
3390: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09  APP_PKI");..}...
33a0: 72 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22  return("INVALID"
33b0: 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20  );.}..#  define 
33c0: 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b 45 59  malloc(x) CACKEY
33d0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
33e0: 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  OC(x, __func__, 
33f0: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66  __LINE__).#  def
3400: 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79  ine realloc(x, y
3410: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
3420: 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79  UNC_REALLOC(x, y
3430: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
3440: 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66 20 73  NE__).#  ifdef s
3450: 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64 65 66  trdup.#    undef
3460: 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64 69 66   strdup.#  endif
3470: 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75  .#  define strdu
3480: 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  p(x) CACKEY_DEBU
3490: 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 78 2c  G_FUNC_STRDUP(x,
34a0: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
34b0: 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20 64 65  E__).#else.#  de
34c0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
34d0: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f  G_PRINTF(x...) /
34e0: 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41  **/.#  define CA
34f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
3500: 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a  BUF(f, x, y) /**
3510: 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  /.#  define CACK
3520: 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28  EY_DEBUG_PERROR(
3530: 78 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  x) /**/.#  defin
3540: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
3550: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78  UNC_TAG_TO_STR(x
3560: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
3570: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
3580: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
3590: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78  CARDERR_TO_STR(x
35a0: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
35b0: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
35c0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
35d0: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22  BJID_TO_STR(x) "
35e0: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
35f0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
3600: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
3610: 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  YPE_TO_STR(x) "D
3620: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
3630: 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20 63 61  endif..struct ca
3640: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
3650: 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ty {..unsigned c
3660: 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a 09  har applet[7];..
3670: 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a 0a  uint16_t file;..
3680: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
3690: 6c 61 62 65 6c 3b 0a 0a 09 73 69 7a 65 5f 74 20  label;...size_t 
36a0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
36b0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
36c0: 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 7d 3b  *certificate;.};
36d0: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
36e0: 69 64 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75  identity {..stru
36f0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
3700: 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
3710: 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54  entity;...CK_ATT
3720: 52 49 42 55 54 45 20 2a 61 74 74 72 69 62 75 74  RIBUTE *attribut
3730: 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74  es;..CK_ULONG at
3740: 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a  tributes_count;.
3750: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
3760: 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74  y_session {..int
3770: 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c   active;...CK_SL
3780: 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09  OT_ID slotID;...
3790: 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a  CK_STATE state;.
37a0: 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b  .CK_FLAGS flags;
37b0: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76  ..CK_ULONG ulDev
37c0: 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f  iceError;..CK_VO
37d0: 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74  ID_PTR pApplicat
37e0: 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20  ion;..CK_NOTIFY 
37f0: 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74  Notify;...struct
3800: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
3810: 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
3820: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
3830: 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a  ntities_count;..
3840: 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69  .int search_acti
3850: 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ve;..CK_ATTRIBUT
3860: 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71 75 65  E_PTR search_que
3870: 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65  ry;..CK_ULONG se
3880: 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
3890: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
38a0: 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b   search_curr_id;
38b0: 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69  ...int sign_acti
38c0: 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53  ve;..CK_MECHANIS
38d0: 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68  M_TYPE sign_mech
38e0: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f  anism;..CK_BYTE_
38f0: 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75  PTR sign_buf;..u
3900: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67  nsigned long sig
3910: 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67  n_buflen;..unsig
3920: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75  ned long sign_bu
3930: 66 75 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63  fused;..struct c
3940: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
3950: 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a  sign_identity;..
3960: 09 69 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74  .int decrypt_act
3970: 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49  ive;..CK_MECHANI
3980: 53 4d 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f  SM_TYPE decrypt_
3990: 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56  mechanism;..CK_V
39a0: 4f 49 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f  OID_PTR decrypt_
39b0: 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55  mech_parm;..CK_U
39c0: 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63  LONG decrypt_mec
39d0: 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75  h_parmlen;..stru
39e0: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
39f0: 74 79 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e  ty *decrypt_iden
3a00: 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  tity;.};..struct
3a10: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09   cackey_slot {..
3a20: 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 63 68  int active;...ch
3a30: 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 3b  ar *pcsc_reader;
3a40: 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72 64  ...int pcsc_card
3a50: 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41  _connected;..SCA
3a60: 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63 61  RDHANDLE pcsc_ca
3a70: 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61  rd;...int transa
3a80: 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 0a 09 69  ction_depth;...i
3a90: 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 7d  nt slot_reset;.}
3aa0: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
3ab0: 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  {..CACKEY_TLV_AP
3ac0: 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31  P_GENERIC = 0x01
3ad0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  ,..CACKEY_TLV_AP
3ae0: 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32  P_SKI     = 0x02
3af0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  ,..CACKEY_TLV_AP
3b00: 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34  P_PKI     = 0x04
3b10: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70  .} cackey_tlv_ap
3b20: 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20  ptype;..typedef 
3b30: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54  enum {..CACKEY_T
3b40: 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c  LV_OBJID_GENERAL
3b50: 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32  INFO       = 0x2
3b60: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
3b70: 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e  _OBJID_PROPERSON
3b80: 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30  ALINFO   = 0x210
3b90: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
3ba0: 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52  BJID_ACCESSCONTR
3bb0: 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c  OL     = 0x3000,
3bc0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3bd0: 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20  ID_LOGIN        
3be0: 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09       = 0x4000,..
3bf0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3c00: 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20  _CARDINFO       
3c10: 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41     = 0x5000,..CA
3c20: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42  CKEY_TLV_OBJID_B
3c30: 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20 20 20  IOMETRICS       
3c40: 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b   = 0x6000,..CACK
3c50: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47  EY_TLV_OBJID_DIG
3c60: 49 54 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d  ITALSIGCERT    =
3c70: 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x7000,..CACKEY
3c80: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
3c90: 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30  ERSON        = 0
3ca0: 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x0200,..CACKEY_T
3cb0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e  LV_OBJID_CAC_BEN
3cc0: 45 46 49 54 53 20 20 20 20 20 20 3d 20 30 78 30  EFITS      = 0x0
3cd0: 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  202,..CACKEY_TLV
3ce0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52  _OBJID_CAC_OTHER
3cf0: 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30  BENEFITS = 0x020
3d00: 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  3,..CACKEY_TLV_O
3d10: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e  BJID_CAC_PERSONN
3d20: 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c  EL     = 0x0201,
3d30: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3d40: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20  ID_CAC_PKICERT  
3d50: 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20       = 0x02FE.} 
3d60: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
3d70: 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  tid;..typedef en
3d80: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53  um {..CACKEY_PCS
3d90: 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
3da0: 20 20 20 20 3d 20 32 2c 0a 09 43 41 43 4b 45 59      = 2,..CACKEY
3db0: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53  _PCSC_S_TOKENABS
3dc0: 45 4e 54 20 20 20 20 20 3d 20 31 2c 0a 09 43 41  ENT     = 1,..CA
3dd0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c              = 0,
3df0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
3e00: 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20  GENERIC         
3e10: 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -1,..CACKEY_PC
3e20: 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20  SC_E_BADPIN     
3e30: 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b       = -2,..CACK
3e40: 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
3e50: 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a            = -3,.
3e60: 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73  } cackey_ret;..s
3e70: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
3e80: 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69  _cardurl {..unsi
3e90: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20  gned char       
3ea0: 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79   rid[5];..cackey
3eb0: 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61  _tlv_apptype   a
3ec0: 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  pptype;..cackey_
3ed0: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62  tlv_objectid  ob
3ee0: 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f  jectid;..cackey_
3ef0: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70  tlv_objectid  ap
3f00: 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  pid;..unsigned c
3f10: 68 61 72 20 20 20 20 20 20 20 20 70 69 6e 69 64  har        pinid
3f20: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
3f30: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a  key_tlv_entity;.
3f40: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
3f50: 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74  v_entity {..uint
3f60: 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74  8_t tag;..size_t
3f70: 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e   length;...union
3f80: 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65   {...void *value
3f90: 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b 65  ;...struct cacke
3fa0: 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76  y_tlv_cardurl *v
3fb0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09  alue_cardurl;...
3fc0: 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79  uint8_t value_by
3fd0: 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74  te;..};...struct
3fe0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
3ff0: 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f  ty *_next;.};../
4000: 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20  * CACKEY Global 
4010: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69  Handles */.stati
4020: 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62  c void *cackey_b
4030: 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73  iglock = NULL;.s
4040: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
4050: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b  key_session cack
4060: 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d  ey_sessions[128]
4070: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
4080: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b  cackey_slot cack
4090: 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73  ey_slots[128];.s
40a0: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
40b0: 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30  _initialized = 0
40c0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ;.static int cac
40d0: 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
40e0: 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49   = 0;.CK_C_INITI
40f0: 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65  ALIZE_ARGS cacke
4100: 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50 43 53 43  y_args;../* PCSC
4110: 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20   Global Handles 
4120: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52  */.static LPSCAR
4130: 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f  DCONTEXT cackey_
4140: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
4150: 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  LL;..static unsi
4160: 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79  gned long cackey
4170: 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64  _getversion(void
4180: 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69  ) {..static unsi
4190: 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c  gned long retval
41a0: 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65   = 255;..unsigne
41b0: 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30  d long major = 0
41c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
41d0: 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61   minor = 0;..cha
41e0: 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e  r *major_str = N
41f0: 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f  ULL;..char *mino
4200: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  r_str = NULL;...
4210: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4220: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
4230: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20  ..if (retval != 
4240: 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  255) {...CACKEY_
4250: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
4260: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63  turning 0x%lx (c
4270: 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c  ached).", retval
4280: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74  );....return(ret
4290: 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  val);..}...retva
42a0: 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50  l = 0;..#ifdef P
42b0: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20  ACKAGE_VERSION. 
42c0: 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72         major_str
42d0: 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49   = PACKAGE_VERSI
42e0: 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73  ON;..if (major_s
42f0: 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d  tr) {..        m
4300: 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d  ajor = strtoul(m
4310: 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72  ajor_str, &minor
4320: 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66  _str, 10);....if
4330: 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09   (minor_str) {..
4340: 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75  ..minor = strtou
4350: 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c  l(minor_str + 1,
4360: 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a   NULL, 10);...}.
4370: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d  .}...retval = (m
4380: 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d  ajor << 16) | (m
4390: 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64  inor << 8);.#end
43a0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
43b0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
43c0: 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76  ing 0x%lx", retv
43d0: 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
43e0: 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f  tval);.}../* PC/
43f0: 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74  SC Related Funct
4400: 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59  ions */./*. * SY
4410: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f  NPOSIS. *     vo
4420: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  id cackey_slots_
4430: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76  disconnect_all(v
4440: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
4450: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
4460: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
4470: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
4480: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
4490: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
44a0: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72  n disconnects fr
44b0: 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a  om all cards.. *
44c0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
44d0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69   cackey_slots_di
44e0: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69  sconnect_all(voi
44f0: 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  d) {..uint32_t i
4500: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
4510: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
4520: 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78  d.");...for (idx
4530: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
4540: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
4550: 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
4560: 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
4570: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
4580: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
4590: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
45a0: 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ed) {....CACKEY_
45b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
45c0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c  ardDisconnect(%l
45d0: 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73  u) called", (uns
45e0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29  igned long) idx)
45f0: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
4600: 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f  nnect(cackey_slo
4610: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72  ts[idx].pcsc_car
4620: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
4630: 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  ARD);...}....cac
4640: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
4650: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
4660: 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ed = 0;...cackey
4670: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
4680: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
4690: 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  0;....if (cackey
46a0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
46b0: 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ve) {....CACKEY_
46c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
46d0: 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f  rking active slo
46e0: 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72  t %lu as being r
46f0: 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64  eset", (unsigned
4700: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d   long) idx);...}
4710: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
4720: 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  [idx].slot_reset
4730: 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45   = 1;..}...CACKE
4740: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4750: 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72  Returning");...r
4760: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
4770: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
4780: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
4790: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76  y_pcsc_connect(v
47a0: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
47b0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
47c0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
47d0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
47e0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
47f0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
4800: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
4810: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
4820: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
4830: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
4840: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63   function connec
4850: 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20  ts to the PC/SC 
4860: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67  Connection Manag
4870: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 74  er and updates t
4880: 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c  he. *     global
4890: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
48a0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
48b0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  t cackey_pcsc_co
48c0: 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c  nnect(void) {..L
48d0: 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f  ONG scard_est_co
48e0: 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65  ntext_ret;.#ifde
48f0: 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41  f HAVE_SCARDISVA
4900: 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47  LIDCONTEXT..LONG
4910: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72   scard_isvalid_r
4920: 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  et;.#endif...CAC
4930: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
4940: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
4950: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
4960: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
4970: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
4980: 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73  andle = malloc(s
4990: 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63  izeof(*cackey_pc
49a0: 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69  sc_handle));...i
49b0: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
49c0: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
49d0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
49e0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
49f0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
4a00: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
4a10: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61  ailure");.....ca
4a20: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
4a30: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09  nnect_all();....
4a40: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
4a50: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
4a60: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
4a70: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
4a80: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
4a90: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09  t() called");...
4aa0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
4ab0: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74  t_ret = SCardEst
4ac0: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43  ablishContext(SC
4ad0: 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d  ARD_SCOPE_SYSTEM
4ae0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61  , NULL, NULL, ca
4af0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4b00: 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65  );...if (scard_e
4b10: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21  st_context_ret !
4b20: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
4b30: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
4b40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
4b50: 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c  l to SCardEstabl
4b60: 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65  ishContext faile
4b70: 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25  d (returned %s/%
4b80: 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  li), returning i
4b90: 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b  n failure", CACK
4ba0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
4bb0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
4bc0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
4bd0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
4be0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
4bf0: 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61  et);.....free(ca
4c00: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4c10: 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  );....cackey_pcs
4c20: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  c_handle = NULL;
4c30: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
4c40: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
4c50: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
4c60: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
4c70: 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  ERIC);...}..}..#
4c80: 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44  ifdef HAVE_SCARD
4c90: 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09  ISVALIDCONTEXT..
4ca0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4cb0: 4e 54 46 28 22 53 43 61 72 64 49 73 56 61 6c 69  NTF("SCardIsVali
4cc0: 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65  dContext() calle
4cd0: 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61  d");..scard_isva
4ce0: 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49  lid_ret = SCardI
4cf0: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63  sValidContext(*c
4d00: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
4d10: 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69  e);..if (scard_i
4d20: 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43  svalid_ret != SC
4d30: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
4d40: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4d50: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
4d60: 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  as become invali
4d70: 64 20 28 53 43 61 72 64 49 73 56 61 6c 69 64 43  d (SCardIsValidC
4d80: 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29  ontext = %s/%li)
4d90: 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65  , trying to re-e
4da0: 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41  stablish...", CA
4db0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4dc0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
4dd0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
4de0: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
4df0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a  _isvalid_ret);..
4e00: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4e10: 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61  RINTF("SCardEsta
4e20: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63  blishContext() c
4e30: 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64  alled");...scard
4e40: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4e50: 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73   = SCardEstablis
4e60: 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53  hContext(SCARD_S
4e70: 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c  COPE_SYSTEM, NUL
4e80: 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f  L, NULL, cackey_
4e90: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
4ea0: 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  if (scard_est_co
4eb0: 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41  ntext_ret != SCA
4ec0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
4ed0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4ee0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20  PRINTF("Call to 
4ef0: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
4f00: 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65  ntext failed (re
4f10: 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20  turned %s/%li), 
4f20: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
4f30: 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45  lure", CACKEY_DE
4f40: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
4f50: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65  R_TO_STR(scard_e
4f60: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c  st_context_ret),
4f70: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73   (long) scard_es
4f80: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a  t_context_ret);.
4f90: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
4fa0: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
4fb0: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  .cackey_pcsc_han
4fc0: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  dle = NULL;.....
4fd0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
4fe0: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
4ff0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5000: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
5010: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
5020: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61  DEBUG_PRINTF("Ha
5030: 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  ndle has been re
5040: 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a  -established");.
5050: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  .}.#endif...CACK
5060: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5070: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  "Sucessfully con
5080: 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c  nected to PC/SC,
5090: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75   returning in su
50a0: 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72  ccess");...retur
50b0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
50c0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
50d0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
50e0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
50f0: 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
5100: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
5110: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
5120: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
5130: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
5140: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
5150: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
5160: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
5170: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
5180: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
5190: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
51a0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f  s function disco
51b0: 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20  nnects from the 
51c0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
51d0: 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64   manager and upd
51e0: 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20  ates. *     the 
51f0: 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20  global handle.. 
5200: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
5210: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
5220: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76  csc_disconnect(v
5230: 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  oid) {..LONG sca
5240: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
5250: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
5260: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
5270: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  d.");...if (cack
5280: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
5290: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
52a0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
52b0: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64  _OK);..}...scard
52c0: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _rel_context_ret
52d0: 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43   = SCardReleaseC
52e0: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70  ontext(*cackey_p
52f0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69  csc_handle);...i
5300: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
5310: 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28  andle) {...free(
5320: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5330: 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f  le);.....cackey_
5340: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
5350: 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  LL;..}...if (sca
5360: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
5370: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
5380: 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72  CCESS) {...retur
5390: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
53a0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72  GENERIC);..}...r
53b0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
53c0: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
53d0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
53e0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
53f0: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
5400: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
5410: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
5420: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
5430: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
5440: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
5450: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
5460: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
5470: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
5480: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
5490: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
54a0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
54b0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
54c0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
54d0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
54e0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
54f0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
5500: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
5510: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
5520: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
5530: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73  ..cackey_ret pcs
5540: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
5550: 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a  DWORD protocol;.
5560: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e  .LONG scard_conn
5570: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
5580: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
5590: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
55a0: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  lot) {...CACKEY_
55b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
55c0: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69  valid slot speci
55d0: 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  fied, returning 
55e0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
55f0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5600: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
5610: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
5620: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
5630: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
5640: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
5650: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
5660: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
5670: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5680: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
5690: 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72   PC/SC failed, r
56a0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
56b0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
56c0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
56d0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
56e0: 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64   Connect to read
56f0: 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  er, if needed */
5700: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
5710: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
5720: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
5730: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
5740: 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c  Connect(%s) call
5750: 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  ed", slot->pcsc_
5760: 72 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64  reader);...scard
5770: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
5780: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
5790: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
57a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
57b0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
57c0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
57d0: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
57e0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
57f0: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
5800: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53  rd_conn_ret != S
5810: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
5820: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
5830: 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
5840: 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69  tion to card fai
5850: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
5860: 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64  n failure (SCard
5870: 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25  Connect() = %s/%
5880: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  li)", CACKEY_DEB
5890: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
58a0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f  _TO_STR(scard_co
58b0: 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  nn_ret), (long) 
58c0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b  scard_conn_ret);
58d0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
58e0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
58f0: 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d  C);...}....slot-
5900: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
5910: 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74  cted = 1;...slot
5920: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
5930: 70 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a 09 72 65  pth = 0;..}...re
5940: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
5950: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
5960: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
5970: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5980: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
5990: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
59a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
59b0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
59c0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
59d0: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
59e0: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
59f0: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
5a00: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
5a10: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
5a20: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
5a30: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
5a40: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
5a50: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
5a60: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
5a70: 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73   *     The trans
5a80: 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  action should be
5a90: 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e   terminated usin
5aa0: 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  g "cackey_end_tr
5ab0: 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a  ansaction". *. *
5ac0: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
5ad0: 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e  ret cackey_begin
5ae0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
5af0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
5b00: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
5b10: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
5b20: 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _ret;..LONG scar
5b30: 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43  d_trans_ret;...C
5b40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5b50: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
5b60: 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74  .cackey_conn_ret
5b70: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
5b80: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
5b90: 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  f (cackey_conn_r
5ba0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
5bb0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
5bc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5bd0: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
5be0: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
5bf0: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
5c00: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
5c10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
5c20: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
5c30: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
5c40: 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ++;...if (slot->
5c50: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
5c60: 68 20 3e 20 31 29 20 7b 0a 09 09 43 41 43 4b 45  h > 1) {...CACKE
5c70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5c80: 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72 61  Already in a tra
5c90: 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72  nsaction, perfor
5ca0: 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28  ming no action (
5cb0: 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69 29 22  new depth = %i)"
5cc0: 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  , slot->transact
5cd0: 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72  ion_depth);....r
5ce0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5cf0: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63  C_S_OK);..}...sc
5d00: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20  ard_trans_ret = 
5d10: 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61  SCardBeginTransa
5d20: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63  ction(slot->pcsc
5d30: 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61  _card);..if (sca
5d40: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20  rd_trans_ret != 
5d50: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
5d60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
5d70: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
5d80: 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61   to begin transa
5d90: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
5da0: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
5db0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5dc0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
5dd0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
5de0: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
5df0: 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73  ully began trans
5e00: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28  action on slot (
5e10: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  %s)", slot->pcsc
5e20: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75  _reader);...retu
5e30: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
5e40: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
5e50: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
5e60: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
5e70: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
5e80: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
5e90: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
5ea0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
5eb0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
5ec0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
5ed0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
5ee0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
5ef0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
5f00: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
5f10: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
5f20: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
5f30: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
5f40: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
5f50: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
5f60: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
5f70: 20 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65   requires "cacke
5f80: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
5f90: 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65  ion" to be calle
5fa0: 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73  d first. *. */.s
5fb0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
5fc0: 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e   cackey_end_tran
5fd0: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
5fe0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
5ff0: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
6000: 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43  trans_ret;...CAC
6010: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6020: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
6030: 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  f (!slot->pcsc_c
6040: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
6050: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6060: 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
6070: 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75  not connected, u
6080: 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61  nable to end tra
6090: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 0a 09 09 72  nsaction");....r
60a0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
60b0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
60c0: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
60d0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
60e0: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
60f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65  DEBUG_PRINTF("Te
6100: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e  rminating a tran
6110: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  saction that has
6120: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a   not begun!");..
6130: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6140: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6150: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
6160: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
6170: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
6180: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
6190: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
61a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61  EBUG_PRINTF("Tra
61b0: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
61c0: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74  in progress, not
61d0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d   terminating on-
61e0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
61f0: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20   (current depth 
6200: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
6210: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
6220: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
6230: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6240: 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74  C);..}...scard_t
6250: 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64  rans_ret = SCard
6260: 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  EndTransaction(s
6270: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
6280: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
6290: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72  );..if (scard_tr
62a0: 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ans_ret != SCARD
62b0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
62c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
62d0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65  NTF("Unable to e
62e0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nd transaction, 
62f0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
6300: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
6310: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6320: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
6330: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6340: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65  ("Sucessfully te
6350: 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63  rminated transac
6360: 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73  tion on slot (%s
6370: 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  )", slot->pcsc_r
6380: 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e  eader);...return
6390: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
63a0: 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52  K);.}../* APDU R
63b0: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73  elated Functions
63c0: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53   */./*. * SYNPOS
63d0: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
63e0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64  _ret cackey_send
63f0: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63  _apdu(struct cac
6400: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
6410: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
6420: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ass, unsigned ch
6430: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  ar instruction, 
6440: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
6450: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6460: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p2, unsigned cha
6470: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  r lc, unsigned c
6480: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
6490: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e  ned char le, uin
64a0: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
64b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
64c0: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
64d0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b   *respdata_len);
64e0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
64f0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
6500: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
6510: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
6520: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
6530: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
6540: 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20   char class. *  
6550: 20 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73         APDU Clas
6560: 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  s (GSCIS_CLASS_I
6570: 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f  SO7816 or GSCIS_
6580: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
6590: 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20  TFORM. *        
65a0: 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29   usually), (CLA)
65b0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
65c0: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63  ned char instruc
65d0: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  tion. *         
65e0: 41 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e  APDU Instruction
65f0: 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20   (INS). *. *    
6600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
6610: 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  1. *         APD
6620: 55 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50  U Parameter 1 (P
6630: 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  1). *. *     uns
6640: 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a  igned char p2. *
6650: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61           APDU Pa
6660: 72 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20  rameter 2 (P2). 
6670: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
6680: 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20  d char lc. *    
6690: 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68       APDU Length
66a0: 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29   of Content (Lc)
66b0: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20   -- this is the 
66c0: 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22  length of "data"
66d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61  . *         para
66e0: 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61  meter.  If "data
66f0: 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  " is specified a
6700: 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72  s NULL, this par
6710: 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20  ameter will. *  
6720: 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65         be ignore
6730: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
6740: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
6750: 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e  . *         Poin
6760: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f  ter to buffer to
6770: 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c   send.  It shoul
6780: 64 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20  d be "Lc" bytes 
6790: 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20  long.  If. *    
67a0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
67b0: 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c  s NULL, "Lc" wil
67c0: 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61  l not be sent, a
67d0: 6e 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77  nd this buffer w
67e0: 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20  ill be. *       
67f0: 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a    ignored.. *. *
6800: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
6810: 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20  ar le. *        
6820: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20   APDU Length of 
6830: 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29  Expectation (Le)
6840: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20   -- this is the 
6850: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a  length of the. *
6860: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65           expecte
6870: 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69  d reply.  If thi
6880: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
6890: 73 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  s 0 then it will
68a0: 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20   not. *         
68b0: 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20  be sent.. *. *  
68c0: 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73     uint16_t *res
68d0: 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20  pcode. *        
68e0: 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74   [OUT] Pointer t
68f0: 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44  o storage of APD
6900: 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e  U response code.
6910: 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20    If this is. * 
6920: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
6930: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  d as NULL, the r
6940: 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c  esponse code wil
6950: 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  l be discarded..
6960: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
6970: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
6980: 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  a. *         [OU
6990: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  T] Pointer to st
69a0: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65  orage of APDU re
69b0: 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66  sponse data.  If
69c0: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20   this is. *     
69d0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
69e0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f   NULL, the respo
69f0: 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65  nse data will be
6a00: 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a   discarded.  If.
6a10: 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22   *         the "
6a20: 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61  respdata_len" pa
6a30: 72 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69  rameter is speci
6a40: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
6a50: 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20  is buffer. *    
6a60: 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65       will not be
6a70: 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20   updated.. *. * 
6a80: 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70      size_t *resp
6a90: 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20  data_len. *     
6aa0: 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f      [IN, OUT] Po
6ab0: 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67  inter initialing
6ac0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6ad0: 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73  size of the "res
6ae0: 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20  pdata". *       
6af0: 20 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72    buffer.  Befor
6b00: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65  e returning, the
6b10: 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75   pointed to valu
6b20: 65 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  e is updated to 
6b30: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e  the. *         n
6b40: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
6b50: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75  ritten to the bu
6b60: 66 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69  ffer.  If this i
6b70: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20  s specified as. 
6b80: 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20  *         NULL, 
6b90: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  it will not be u
6ba0: 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73  pdated, and "res
6bb0: 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69  pdata" will be i
6bc0: 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20  gnored causing. 
6bd0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65  *         the re
6be0: 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62  sponse data to b
6bf0: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a  e discarded.. *.
6c00: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6c10: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6c20: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
6c30: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
6c40: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
6c50: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
6c60: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
6c70: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
6c80: 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63  tion will connec
6c90: 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43  t to the PC/SC C
6ca0: 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65  onnection Manage
6cb0: 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63  r via. *     cac
6cc0: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
6cd0: 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a  () if needed.. *
6ce0: 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20  . *     It will 
6cf0: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63  connect to the c
6d00: 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 65  ard in the reade
6d10: 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  r attached to th
6d20: 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70  e slot. *     sp
6d30: 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c  ecified.  It wil
6d40: 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74  l reconnect to t
6d50: 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20 63  he card if the c
6d60: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20  onnection. *    
6d70: 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20   goes away.. *. 
6d80: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
6d90: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64  _ret cackey_send
6da0: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63  _apdu(struct cac
6db0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
6dc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
6dd0: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ass, unsigned ch
6de0: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  ar instruction, 
6df0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
6e00: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6e10: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p2, unsigned cha
6e20: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  r lc, unsigned c
6e30: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
6e40: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e  ned char le, uin
6e50: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
6e60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6e70: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
6e80: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20   *respdata_len) 
6e90: 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72  {..uint8_t major
6ea0: 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09  _rc, minor_rc;..
6eb0: 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f  size_t bytes_to_
6ec0: 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61  copy, tmp_respda
6ed0: 74 61 5f 6c 65 6e 3b 0a 09 44 57 4f 52 44 20 70  ta_len;..DWORD p
6ee0: 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20  rotocol;..DWORD 
6ef0: 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c  xmit_len, recv_l
6f00: 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  en;..LONG scard_
6f10: 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f  xmit_ret, scard_
6f20: 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54  reconn_ret;..BYT
6f30: 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d  E xmit_buf[1024]
6f40: 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d  , recv_buf[1024]
6f50: 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e  ;..int pcsc_conn
6f60: 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65  ect_ret, pcsc_ge
6f70: 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20  tresp_ret;..int 
6f80: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
6f90: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6fa0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
6fb0: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
6fc0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
6fd0: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
6fe0: 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ied.");....retur
6ff0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
7000: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70  GENERIC);..}...p
7010: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
7020: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
7030: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
7040: 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
7050: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
7060: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
7070: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7080: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
7090: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
70a0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
70b0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
70c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
70d0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72  RIC);..}.../* Tr
70e0: 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f  ansmit */..xmit_
70f0: 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62  len = 0;..xmit_b
7100: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
7110: 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75   class;..xmit_bu
7120: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
7130: 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d  instruction;..xm
7140: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
7150: 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62  +] = p1;..xmit_b
7160: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
7170: 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20   p2;..if (data) 
7180: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  {...xmit_buf[xmi
7190: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09  t_len++] = lc;..
71a0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
71b0: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20  dx < lc; idx++) 
71c0: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
71d0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61  it_len++] = data
71e0: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  [idx];...}..}...
71f0: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20  if (le != 0x00) 
7200: 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  {...xmit_buf[xmi
7210: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09  t_len++] = le;..
7220: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61  }.../* Begin Sma
7230: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
7240: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
7250: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
7260: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61  slot);...if (cla
7270: 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53  ss == GSCIS_CLAS
7280: 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73  S_ISO7816 && ins
7290: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49  truction == GSCI
72a0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26  S_INSTR_VERIFY &
72b0: 26 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20  & p1 == 0x00 && 
72c0: 70 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  p2 == 0x00) {...
72d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
72e0: 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44  NTF("Sending APD
72f0: 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22  U: <<censored>>"
7300: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43  );..} else {...C
7310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7320: 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50  TBUF("Sending AP
7330: 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20  DU:", xmit_buf, 
7340: 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  xmit_len);..}...
7350: 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  recv_len = sizeo
7360: 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63  f(recv_buf);..sc
7370: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
7380: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
7390: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
73a0: 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74  ARD_PCI_T0, xmit
73b0: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
73c0: 53 43 41 52 44 5f 50 43 49 5f 54 31 2c 20 72 65  SCARD_PCI_T1, re
73d0: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65  cv_buf, &recv_le
73e0: 6e 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 78  n);..if (scard_x
73f0: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
7400: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
7410: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7420: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
7430: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
7440: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
7450: 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41  ) = %s/%lx)", CA
7460: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
7470: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
7480: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
7490: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
74a0: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
74b0: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
74c0: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
74d0: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20   slot as having 
74e0: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 0a 09  been reset");...
74f0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
7500: 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
7510: 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74  slot->slot_reset
7520: 20 3d 20 31 3b 0a 0a 09 09 69 66 20 28 73 63 61   = 1;....if (sca
7530: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53  rd_xmit_ret == S
7540: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
7550: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
7560: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
7570: 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65  et required, ple
7580: 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a  ase hold...");..
7590: 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  ...scard_reconn_
75a0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e  ret = SCardRecon
75b0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
75c0: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52  card, SCARD_SHAR
75d0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
75e0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41  PROTOCOL_T0, SCA
75f0: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26  RD_RESET_CARD, &
7600: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66  protocol);....if
7610: 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72   (scard_reconn_r
7620: 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
7630: 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20  CCESS) {...../* 
7640: 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
7650: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
7660: 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
7670: 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
7680: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
7690: 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
76a0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
76b0: 74 68 2d 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65  th--;......cacke
76c0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
76d0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
76e0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
76f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
7700: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
7710: 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 09  ransmitting");..
7720: 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  ...scard_xmit_re
7730: 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69  t = SCardTransmi
7740: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
7750: 64 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c  d, SCARD_PCI_T0,
7760: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
7770: 6c 65 6e 2c 20 53 43 41 52 44 5f 50 43 49 5f 54  len, SCARD_PCI_T
7780: 30 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65  0, recv_buf, &re
7790: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66  cv_len);......if
77a0: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
77b0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
77c0: 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ESS) {......CACK
77d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
77e0: 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69 6c  "Retransmit fail
77f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
7800: 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20 64   failure after d
7810: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65  isconnecting the
7820: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e   card (SCardTran
7830: 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c  smit = %s/%li)",
7840: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
7850: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
7860: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
7870: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
7880: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09  _xmit_ret);.....
7890: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
78a0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
78b0: 64 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  d, SCARD_RESET_C
78c0: 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  ARD);......slot-
78d0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
78e0: 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09  cted = 0;.......
78f0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
7900: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
7910: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
7920: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31  action_depth = 1
7930: 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65 6e  ;......cackey_en
7940: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
7950: 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  ot);.......retur
7960: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
7970: 47 45 4e 45 52 49 43 29 3b 0a 09 09 09 09 7d 0a  GENERIC);.....}.
7980: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
7990: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
79a0: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
79b0: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09  ng card");......
79c0: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
79d0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
79e0: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
79f0: 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63  D);.....slot->pc
7a00: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
7a10: 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45  d = 0;....../* E
7a20: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
7a30: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  nsaction */.....
7a40: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7a50: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
7a60: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
7a70: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
7a80: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7a90: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
7aa0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
7ab0: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
7ac0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7ad0: 43 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  C);....}...} els
7ae0: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
7af0: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
7b00: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
7b10: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
7b20: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
7b30: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53  _card, SCARD_RES
7b40: 45 54 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f  ET_CARD);....slo
7b50: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
7b60: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
7b70: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
7b80: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
7b90: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
7ba0: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
7bb0: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
7bc0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
7bd0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
7be0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
7bf0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
7c00: 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
7c10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7c20: 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  C);...}..}...CAC
7c30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
7c40: 55 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c  UF("Returned Val
7c50: 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20  ue:", recv_buf, 
7c60: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  recv_len);...if 
7c70: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b  (recv_len < 2) {
7c80: 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65  .../* Minimal re
7c90: 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73  sponse length is
7ca0: 20 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e   2 bytes, return
7cb0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a  ing in failure *
7cc0: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
7cd0: 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73  _PRINTF("Respons
7ce0: 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74  e too small, ret
7cf0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7d00: 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c  e (recv_len = %l
7d10: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
7d20: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
7d30: 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
7d40: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
7d50: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
7d60: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
7d70: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
7d80: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7d90: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  IC);..}.../* Det
7da0: 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f  ermine result co
7db0: 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20  de */..major_rc 
7dc0: 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f  = recv_buf[recv_
7dd0: 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72  len - 2];..minor
7de0: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
7df0: 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69  ecv_len - 1];..i
7e00: 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09  f (respcode) {..
7e10: 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61  .*respcode = (ma
7e20: 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d  jor_rc << 8) | m
7e30: 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a  inor_rc;..}.../*
7e40: 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20   Adjust message 
7e50: 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f  buffer */..recv_
7e60: 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41  len -= 2;.../* A
7e70: 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75  dd bytes to retu
7e80: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70  rn value */..tmp
7e90: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  _respdata_len = 
7ea0: 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61  0;..if (respdata
7eb0: 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e   && respdata_len
7ec0: 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61  ) {...tmp_respda
7ed0: 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61  ta_len = *respda
7ee0: 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73  ta_len;....bytes
7ef0: 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70  _to_copy = *resp
7f00: 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20  data_len;....if 
7f10: 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65  (recv_len < byte
7f20: 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09  s_to_copy) {....
7f30: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
7f40: 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  recv_len;...}...
7f50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7f60: 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c  INTF("Copying %l
7f70: 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62  u bytes to the b
7f80: 75 66 66 65 72 22 2c 20 28 75 6e 73 69 67 6e 65  uffer", (unsigne
7f90: 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f  d long) bytes_to
7fa0: 5f 63 6f 70 79 29 3b 0a 0a 09 09 6d 65 6d 63 70  _copy);....memcp
7fb0: 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63 76  y(respdata, recv
7fc0: 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63  _buf, bytes_to_c
7fd0: 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61  opy);...respdata
7fe0: 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70   += bytes_to_cop
7ff0: 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f  y;....*respdata_
8000: 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63  len = bytes_to_c
8010: 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64  opy;...tmp_respd
8020: 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73  ata_len -= bytes
8030: 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73  _to_copy;..} els
8040: 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c  e {...if (recv_l
8050: 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  en != 0) {....CA
8060: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8070: 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79  F("Throwing away
8080: 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68   %lu bytes, nowh
8090: 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21  ere to put them!
80a0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
80b0: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09  g) recv_len);...
80c0: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72  }..}...if (major
80d0: 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09  _rc == 0x61) {..
80e0: 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52  ./* We need to R
80f0: 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  EAD */...CACKEY_
8100: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
8110: 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69 72  ffer read requir
8120: 65 64 22 29 3b 0a 0a 09 09 70 63 73 63 5f 67 65  ed");....pcsc_ge
8130: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b  tresp_ret = cack
8140: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
8150: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
8160: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
8170: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45  STR_GET_RESPONSE
8180: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c  , 0x00, 0x00, 0,
8190: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c   NULL, minor_rc,
81a0: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64   respcode, respd
81b0: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61  ata, &tmp_respda
81c0: 74 61 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 70  ta_len);...if (p
81d0: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
81e0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
81f0: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
8200: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
8210: 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65  uffer read faile
8220: 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e  d!  Returning in
8230: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
8240: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
8250: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
8260: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
8270: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
8280: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
8290: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
82a0: 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72  C);...}....if (r
82b0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
82c0: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  ..*respdata_len 
82d0: 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  += tmp_respdata_
82e0: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45  len;...}..../* E
82f0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
8300: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61  nsaction */...ca
8310: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
8320: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43  tion(slot);....C
8330: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8340: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
8350: 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72   success (buffer
8360: 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22   read complete)"
8370: 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8380: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
8390: 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  }.../* End Smart
83a0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
83b0: 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
83c0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
83d0: 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72  );...if (major_r
83e0: 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f  c == 0x90) {.../
83f0: 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43  * Success */...C
8400: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8410: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
8420: 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f   success (major_
8430: 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09  rc = 0x90)");...
8440: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8450: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a  CSC_S_OK);..}...
8460: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8470: 49 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72  INTF("APDU Retur
8480: 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65  ned an error, re
8490: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
84a0: 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  re");...return(C
84b0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
84c0: 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  ERIC);.}../*. * 
84d0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
84e0: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72  ssize_t cackey_r
84f0: 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63  ead_buffer(struc
8500: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8510: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
8520: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
8530: 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e  _t count, unsign
8540: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20  ed char t_or_v, 
8550: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
8560: 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  ffset);. *. * AR
8570: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
8580: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8590: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
85a0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
85b0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
85c0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
85d0: 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20  har *buffer. *  
85e0: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66         [OUT] Buf
85f0: 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  fer. *. *     si
8600: 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20  ze_t count. *   
8610: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
8620: 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74  bytes to attempt
8630: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20   to read. *. *  
8640: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
8650: 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20   t_or_v. *      
8660: 20 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d     Select the T-
8670: 62 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56  buffer (01) or V
8680: 2d 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20  -buffer (02) to 
8690: 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a  read from.  . *.
86a0: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e   *     size_t in
86b0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20  itial_offset. * 
86c0: 20 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20          Specify 
86d0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  the offset to be
86e0: 67 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f  gin the read fro
86f0: 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  m. *. *. * RETUR
8700: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
8710: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
8720: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
8730: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
8740: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
8750: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
8760: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
8770: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
8780: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61  ize_t cackey_rea
8790: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20  d_buffer(struct 
87a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
87b0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
87c0: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
87d0: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64   count, unsigned
87e0: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69   char t_or_v, si
87f0: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
8800: 73 65 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 6f  set) {..size_t o
8810: 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f  ffset = 0, max_o
8820: 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74  ffset, max_count
8830: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
8840: 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36   cmd[2];..uint16
8850: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e  _t respcode;..in
8860: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
8870: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8880: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
8890: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75  max_offset = cou
88a0: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  nt;..max_count =
88b0: 20 32 35 32 3b 0a 0a 09 69 66 20 28 74 5f 6f 72   252;...if (t_or
88c0: 5f 76 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f  _v != 1 && t_or_
88d0: 76 20 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b  v != 2) {...CACK
88e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
88f0: 22 49 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20  "Invalid T or V 
8900: 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
8910: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
8920: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
8930: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
8940: 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76  .cmd[0] = t_or_v
8950: 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ;...while (1) {.
8960: 09 09 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20  ..if (offset >= 
8970: 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09  max_offset) {...
8980: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8990: 49 4e 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f  INTF("Buffer too
89a0: 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e   small, returnin
89b0: 67 20 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e  g what we got...
89c0: 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ");.....break;..
89d0: 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61  .}....count = ma
89e0: 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65  x_offset - offse
89f0: 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e  t;...if (count >
8a00: 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09   max_count) {...
8a10: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  .count = max_cou
8a20: 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31  nt;...}....cmd[1
8a30: 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65  ] = count;....se
8a40: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
8a50: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
8a60: 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42  GSCIS_CLASS_GLOB
8a70: 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43  AL_PLATFORM, GSC
8a80: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
8a90: 46 46 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f  FFER, ((initial_
8aa0: 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29  offset + offset)
8ab0: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28   >> 8) & 0xff, (
8ac0: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b  initial_offset +
8ad0: 20 6f 66 66 73 65 74 29 20 26 20 30 78 66 66 2c   offset) & 0xff,
8ae0: 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d   sizeof(cmd), cm
8af0: 64 2c 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f  d, 0x00, &respco
8b00: 64 65 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66  de, buffer + off
8b10: 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 09 09  set, &count);...
8b20: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
8b30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8b40: 29 20 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63  ) {....if (respc
8b50: 6f 64 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b  ode == 0x6A86) {
8b60: 0a 09 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75  .....if (max_cou
8b70: 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09  nt == 1) {......
8b80: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
8b90: 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61  ..max_count = ma
8ba0: 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09  x_count / 2;....
8bb0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
8bc0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
8bd0: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
8be0: 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69  _send_apdu() fai
8bf0: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
8c00: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
8c10: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
8c20: 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f  ....offset += co
8c30: 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e  unt;....if (coun
8c40: 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b  t < max_count) {
8c50: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8c60: 5f 50 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72  _PRINTF("Short r
8c70: 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25  ead -- count = %
8c80: 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c  i, cmd[1] = %i",
8c90: 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69   (int) count, (i
8ca0: 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09  nt) cmd[1]);....
8cb0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
8cc0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
8cd0: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
8ce0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
8cf0: 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f  ..if (offset > _
8d00: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29  POSIX_SSIZE_MAX)
8d10: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
8d20: 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74  G_PRINTF("Offset
8d30: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
8d40: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
8d50: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
8d60: 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74  ax = %li, offset
8d70: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
8d80: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
8d90: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
8da0: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72  g) offset);....r
8db0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
8dc0: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
8dd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8de0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
8df0: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20  n success, read 
8e00: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73  %lu bytes", (uns
8e10: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73  igned long) offs
8e20: 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66  et);...return(of
8e30: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  fset);.}../*. * 
8e40: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
8e50: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8e60: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
8e70: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8e80: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
8e90: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
8ea0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20  ze_t aid_len);. 
8eb0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
8ec0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
8ed0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
8ee0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
8ef0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
8f00: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
8f10: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a  igned char *aid.
8f20: 20 2a 20 20 20 20 20 20 20 20 20 42 75 66 66 65   *         Buffe
8f30: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70  r containing App
8f40: 6c 65 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74  let ID to select
8f50: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
8f60: 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20  t aid_len. *    
8f70: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62       Number of b
8f80: 79 74 65 73 20 69 6e 20 74 68 65 20 22 61 69 64  ytes in the "aid
8f90: 22 20 28 41 70 70 6c 65 74 20 49 44 29 20 70 61  " (Applet ID) pa
8fa0: 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45  rameter. *. * RE
8fb0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
8fc0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
8fd0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
8fe0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
8ff0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9000: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
9010: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
9020: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
9030: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
9040: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
9050: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  plet(struct cack
9060: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
9070: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
9080: 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65  d, size_t aid_le
9090: 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  n) {..int send_r
90a0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
90b0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
90c0: 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
90d0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53  EBUG_PRINTBUF("S
90e0: 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a  electing applet:
90f0: 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29  ", aid, aid_len)
9100: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
9110: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
9120: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
9130: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
9140: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47  _INSTR_SELECT, G
9150: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
9160: 54 5f 41 50 50 4c 45 54 2c 20 30 78 30 43 2c 20  T_APPLET, 0x0C, 
9170: 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78  aid_len, aid, 0x
9180: 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  00, NULL, NULL, 
9190: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64  NULL);..if (send
91a0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
91b0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
91c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
91d0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  F("Failed to ope
91e0: 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e  n applet, return
91f0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
9200: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9210: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9220: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
9230: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
9240: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
9250: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
9260: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
9270: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
9280: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
9290: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
92a0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
92b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
92c0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
92d0: 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  t ef);. *. * ARG
92e0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
92f0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
9300: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
9310: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
9320: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
9330: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66       uint16_t ef
9340: 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d  . *         Elem
9350: 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65  ental File to se
9360: 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52  lect. *. * RETUR
9370: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
9380: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
9390: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
93a0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
93b0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
93c0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
93d0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
93e0: 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45  his selects an E
93f0: 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28  lementary File (
9400: 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75  EF) under the cu
9410: 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64  rrently selected
9420: 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65  . *     Dedicate
9430: 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20  d File (DF). *. 
9440: 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20  *     Typically 
9450: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  this is called a
9460: 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74  fter selecting t
9470: 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65  he correct Apple
9480: 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20  t (using. *     
9490: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
94a0: 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72  plet) for VM car
94b0: 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ds. *. */.static
94c0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
94d0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
94e0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
94f0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
9500: 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65  t ef) {..unsigne
9510: 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32  d char fid_buf[2
9520: 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  ];..int send_ret
9530: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
9540: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
9550: 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68  ");.../* Open th
9560: 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c  e elementary fil
9570: 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d  e */..fid_buf[0]
9580: 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30   = (ef >> 8) & 0
9590: 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d  xff;..fid_buf[1]
95a0: 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09   = ef & 0xff;...
95b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
95c0: 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66  NTF("Selecting f
95d0: 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e  ile: %04lx", (un
95e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29  signed long) ef)
95f0: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
9600: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
9610: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
9620: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
9630: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30  _INSTR_SELECT, 0
9640: 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f  x02, 0x0C, sizeo
9650: 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f  f(fid_buf), fid_
9660: 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  buf, 0x00, NULL,
9670: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69   NULL, NULL);..i
9680: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
9690: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
96a0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
96b0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
96c0: 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72   to open file, r
96d0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
96e0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
96f0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
9700: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
9710: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9720: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
9730: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b  selected file");
9740: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9750: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
9760: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
9770: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
9780: 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63  y_free_tlv(struc
9790: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
97a0: 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20  ity *root);. *. 
97b0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
97c0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
97d0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f  _tlv_entity *roo
97e0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f  t. *         Roo
97f0: 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73  t of the TLV lis
9800: 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69  t to start freei
9810: 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ng. *. * RETURN 
9820: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
9830: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
9840: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
9850: 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56  on frees the TLV
9860: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72   linked listed r
9870: 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20  eturned from. * 
9880: 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64      "cackey_read
9890: 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  _tlv". *. */.sta
98a0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
98b0: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
98c0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
98d0: 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75  y *root) {..stru
98e0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
98f0: 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78  tity *curr, *nex
9900: 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d  t;...if (root ==
9910: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
9920: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72  n;..}...for (cur
9930: 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20  r = root; curr; 
9940: 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09  curr = next) {..
9950: 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e  .next = curr->_n
9960: 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ext;....switch (
9970: 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09  curr->tag) {....
9980: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
9990: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73  CR_TABLE:....cas
99a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
99b0: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20  IFICATE:.....if 
99c0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a  (curr->value) {.
99d0: 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e  .....free(curr->
99e0: 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09  value);.....}...
99f0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
9a00: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
9a10: 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  RL:.....if (curr
9a20: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
9a30: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
9a40: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
9a50: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
9a60: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28  ak;...}....free(
9a70: 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  curr);..}...retu
9a80: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
9a90: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
9aa0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
9ab0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
9ac0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
9ad0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
9ae0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
9af0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
9b00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
9b10: 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  _entity *cackey_
9b20: 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20  read_tlv(struct 
9b30: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
9b40: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
9b50: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
9b60: 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f  curr_entity, *ro
9b70: 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74  ot = NULL, *last
9b80: 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e   = NULL;..unsign
9b90: 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66  ed char tlen_buf
9ba0: 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30  [2], tval_buf[10
9bb0: 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73  24], *tval;..uns
9bc0: 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f  igned char vlen_
9bd0: 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66  buf[2], vval_buf
9be0: 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09  [8192], *vval;..
9bf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
9c00: 6d 70 62 75 66 3b 0a 09 73 73 69 7a 65 5f 74 20  mpbuf;..ssize_t 
9c10: 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69  tlen, vlen;..ssi
9c20: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09  ze_t read_ret;..
9c30: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20  size_t offset_t 
9c40: 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20  = 0, offset_v = 
9c50: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  0;..unsigned cha
9c60: 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  r tag;..size_t l
9c70: 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41  ength;.#ifdef HA
9c80: 56 45 5f 4c 49 42 5a 0a 09 75 4c 6f 6e 67 66 20  VE_LIBZ..uLongf 
9c90: 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20  tmpbuflen;..int 
9ca0: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a  uncompress_ret;.
9cb0: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
9cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
9cd0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f  lled.");...read_
9ce0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
9cf0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74  d_buffer(slot, t
9d00: 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  len_buf, sizeof(
9d10: 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66  tlen_buf), 1, of
9d20: 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65  fset_t);..if (re
9d30: 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66  ad_ret != sizeof
9d40: 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09  (tlen_buf)) {...
9d50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9d60: 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64  NTF("Read failed
9d70: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
9d80: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9d90: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
9da0: 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66  tlen = (tlen_buf
9db0: 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e  [1] << 8) | tlen
9dc0: 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f  _buf[0];...read_
9dd0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
9de0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76  d_buffer(slot, v
9df0: 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  len_buf, sizeof(
9e00: 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66  vlen_buf), 2, of
9e10: 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65  fset_v);..if (re
9e20: 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66  ad_ret != sizeof
9e30: 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09  (vlen_buf)) {...
9e40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9e50: 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64  NTF("Read failed
9e60: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
9e70: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9e80: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
9e90: 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66  vlen = (vlen_buf
9ea0: 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e  [1] << 8) | vlen
9eb0: 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45  _buf[0];...CACKE
9ec0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9ed0: 54 61 67 20 4c 65 6e 67 74 68 20 3d 20 25 69 2c  Tag Length = %i,
9ee0: 20 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20   Value Length = 
9ef0: 25 69 22 2c 20 74 6c 65 6e 2c 20 76 6c 65 6e 29  %i", tlen, vlen)
9f00: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20  ;...offset_t += 
9f10: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20  2;..offset_v += 
9f20: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20  2;...if (tlen > 
9f30: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29  sizeof(tval_buf)
9f40: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9f50: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c  UG_PRINTF("Tag l
9f60: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72  ength is too lar
9f70: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ge, returning in
9f80: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
9f90: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
9fa0: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a  ..if (vlen > siz
9fb0: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b  eof(vval_buf)) {
9fc0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9fd0: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65  PRINTF("Value le
9fe0: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
9ff0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
a000: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
a010: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
a020: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
a030: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
a040: 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74  lot, tval_buf, t
a050: 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  len, 1, offset_t
a060: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
a070: 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41   != tlen) {...CA
a080: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a090: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
a0a0: 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65  d entire T-buffe
a0b0: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
a0c0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
a0d0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
a0e0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
a0f0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
a100: 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76  lot, vval_buf, v
a110: 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  len, 2, offset_v
a120: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
a130: 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41   != vlen) {...CA
a140: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a150: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
a160: 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65  d entire V-buffe
a170: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
a180: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
a190: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
a1a0: 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66  .tval = tval_buf
a1b0: 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62  ;..vval = vval_b
a1c0: 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e  uf;..while (tlen
a1d0: 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30   > 0 && vlen > 0
a1e0: 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61  ) {...tag = *tva
a1f0: 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74  l;...tval++;...t
a200: 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74  len--;....if (*t
a210: 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09  val == 0xff) {..
a220: 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c  ..length = (tval
a230: 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c  [2] << 8) | tval
a240: 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20  [1];....tval += 
a250: 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b  3;....tlen -= 3;
a260: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
a270: 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09  ength = *tval;..
a280: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65  ..tval++;....tle
a290: 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  n--;...}....CACK
a2a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a2b0: 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22  "Tag: %s (%02x)"
a2c0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
a2d0: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74  UNC_TAG_TO_STR(t
a2e0: 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  ag), (unsigned i
a2f0: 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b  nt) tag);...CACK
a300: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
a310: 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c  F("Value:", vval
a320: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75  , length);....cu
a330: 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  rr_entity = NULL
a340: 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29  ;...switch (tag)
a350: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
a360: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
a370: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
a380: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
a390: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
a3a0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
a3b0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d  alue_cardurl = m
a3c0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
a3d0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
a3e0: 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09  _cardurl));.....
a3f0: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74  .memcpy(curr_ent
a400: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
a410: 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35  rl->rid, vval, 5
a420: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
a430: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
a440: 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61  l->apptype = vva
a450: 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[5];.....curr_e
a460: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
a470: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d  durl->objectid =
a480: 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20   (vval[6] << 8) 
a490: 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63  | vval[7];.....c
a4a0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
a4b0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
a4c0: 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38   = (vval[8] << 8
a4d0: 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09  ) | vval[9];....
a4e0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
a4f0: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
a500: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
a510: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
a520: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
a530: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
a540: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
a550: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
a560: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
a570: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
a580: 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a  alloc(length);..
a590: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
a5a0: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
a5b0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
a5c0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
a5d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a5e0: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
a5f0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a600: 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66  ->value = tmpbuf
a610: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
a620: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
a630: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
a640: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
a650: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
a660: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
a670: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
a680: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  r_entity));.....
a690: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
a6a0: 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70  gth * 2;.....tmp
a6b0: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
a6c0: 62 75 66 6c 65 6e 29 3b 0a 0a 23 69 66 64 65 66  buflen);..#ifdef
a6d0: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 75   HAVE_LIBZ.....u
a6e0: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
a6f0: 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75  uncompress(tmpbu
a700: 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76  f, &tmpbuflen, v
a710: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
a720: 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
a730: 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret != Z_OK) {.
a740: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a750: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
a760: 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20   to decompress, 
a770: 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74  uncompress() ret
a780: 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f  urned %i -- reso
a790: 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20  rting to direct 
a7a0: 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73  copy", uncompres
a7b0: 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d  s_ret);.......tm
a7c0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
a7d0: 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  ;......memcpy(tm
a7e0: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
a7f0: 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  th);.....}......
a800: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a810: 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
a820: 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
a830: 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65  , tmpbuflen);.#e
a840: 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  lse.....CACKEY_D
a850: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73  EBUG_PRINTF("Mis
a860: 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72  sing ZLIB Suppor
a870: 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63  t, this certific
a880: 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73  ate is likely us
a890: 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09  eless...");.....
a8a0: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
a8b0: 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  gth;.....memcpy(
a8c0: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
a8d0: 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ngth);.#endif...
a8e0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a8f0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
a900: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
a910: 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  th = tmpbuflen;.
a920: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
a930: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
a940: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a950: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
a960: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
a970: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
a980: 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65  CS15:.....curr_e
a990: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
a9a0: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
a9b0: 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ty));......curr_
a9c0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
a9d0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
a9e0: 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d  ty->value_byte =
a9f0: 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75   vval[0];.....cu
aa00: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
aa10: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
aa20: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c  eak;...}....vval
aa30: 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c   += length;...vl
aa40: 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09  en -= length;...
aa50: 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79  .if (curr_entity
aa60: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
aa70: 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (root == NULL)
aa80: 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75   {.....root = cu
aa90: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
aaa0: 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20  ....if (last != 
aab0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74  NULL) {.....last
aac0: 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65  ->_next = curr_e
aad0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
aae0: 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  last = curr_enti
aaf0: 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ty;...}..}...ret
ab00: 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a  urn(root);.}../*
ab10: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
ab20: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
ab30: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
ab40: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
ab50: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
ab60: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
ab70: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
ab80: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
ab90: 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72  y_free_certs(str
aba0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
abb0: 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c  identity *start,
abc0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69   size_t count, i
abd0: 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b  nt free_start) {
abe0: 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09  ..size_t idx;...
abf0: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
ac00: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  x < count; idx++
ac10: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b  ) {...if (start[
ac20: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
ac30: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72  ) {....free(star
ac40: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
ac50: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  te);...}..}...if
ac60: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a   (free_start) {.
ac70: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09  ..free(start);..
ac80: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
ac90: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
aca0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
acb0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
acc0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
acd0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
ace0: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
acf0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
ad00: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
ad10: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
ad20: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
ad30: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
ad40: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
ad50: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
ad60: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72  sc_identity *cer
ad70: 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ts, unsigned lon
ad80: 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72  g *count) {..str
ad90: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
ada0: 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
adb0: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
adc0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63  y_tlv_entity *cc
add0: 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72  c_tlv, *ccc_curr
ade0: 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70  , *app_tlv, *app
adf0: 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _curr;..unsigned
ae00: 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20   char ccc_aid[] 
ae10: 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43  = {GSCIS_AID_CCC
ae20: 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
ae30: 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09  r curr_aid[7];..
ae40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75  unsigned long ou
ae50: 74 69 64 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tidx = 0;..cacke
ae60: 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74 69 6f  y_ret transactio
ae70: 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 63 65 72 74  n_ret;..int cert
ae80: 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e  s_resizable;..in
ae90: 74 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65  t send_ret, sele
aea0: 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ct_ret;...CACKEY
aeb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
aec0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
aed0: 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  count == NULL) {
aee0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
aef0: 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73  PRINTF("count is
af00: 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67   NULL, returning
af10: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
af20: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
af30: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21  .}...if (certs !
af40: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
af50: 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  *count == 0) {..
af60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
af70: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64  RINTF("Requested
af80: 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a   we return 0 obj
af90: 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63  ects, short-circ
afa0: 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  uit");.....retur
afb0: 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
afc0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
afd0: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
afe0: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
aff0: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
b000: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
b010: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
b020: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
b030: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
b040: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
b050: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
b060: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
b070: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
b080: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
b090: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
b0a0: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
b0b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
b0c0: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
b0d0: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
b0e0: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
b0f0: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
b100: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
b110: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
b120: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65   = 0;..}.../* Se
b130: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
b140: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
b150: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
b160: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
b170: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
b180: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
b190: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
b1a0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
b1b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b1c0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73  NTF("Unable to s
b1d0: 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74  elect CCC Applet
b1e0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
b1f0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20  ailure");..../* 
b200: 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
b210: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b220: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
b230: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b240: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
b250: 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64  L);..}.../* Read
b260: 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
b270: 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
b280: 54 4c 56 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20  TLV */..ccc_tlv 
b290: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c  = cackey_read_tl
b2a0: 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f  v(slot);.../* Lo
b2b0: 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20  ok for CARDURLs 
b2c0: 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20  that coorespond 
b2d0: 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a  to PKI applets *
b2e0: 2f 0a 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72  /..for (ccc_curr
b2f0: 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f   = ccc_tlv; ccc_
b300: 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d  curr; ccc_curr =
b310: 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   ccc_curr->_next
b320: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
b330: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
b340: 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20   tag: %s ... ", 
b350: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
b360: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63  C_TAG_TO_STR(ccc
b370: 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09  _curr->tag));...
b380: 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74  .if (ccc_curr->t
b390: 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
b3a0: 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 43 41  CARDURL) {....CA
b3b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b3c0: 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
b3d0: 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
b3e0: 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c  re about CARDURL
b3f0: 73 29 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  s)");.....contin
b400: 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ue;...}....if ((
b410: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
b420: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
b430: 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
b440: 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
b450: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
b460: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b470: 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
b480: 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
b490: 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b  ly care about PK
b4a0: 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20  I applets, this 
b4b0: 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a  applet supports:
b4c0: 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b   %s/%02x)", CACK
b4d0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
b4e0: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63  PTYPE_TO_STR(ccc
b4f0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b500: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20  durl->apptype), 
b510: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63  (unsigned int) c
b520: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
b530: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
b540: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
b550: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
b560: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
b570: 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
b580: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
b590: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
b5a0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b5b0: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 43 41 43 4b  l->rid));...CACK
b5c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b5d0: 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c  "AppID = %s/%04l
b5e0: 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
b5f0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
b600: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
b610: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
b620: 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
b630: 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
b640: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
b650: 69 64 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  id);...CACKEY_DE
b660: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65  BUG_PRINTF("Obje
b670: 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ctID = %s/%04lx"
b680: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
b690: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
b6a0: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
b6b0: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
b6c0: 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
b6d0: 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
b6e0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
b6f0: 6a 65 63 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63  jectid);....memc
b700: 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
b710: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b720: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
b730: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
b740: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
b750: 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ;...curr_aid[siz
b760: 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
b770: 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e  2] = (ccc_curr->
b780: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
b790: 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66  ppid >> 8) & 0xf
b7a0: 66 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69  f;...curr_aid[si
b7b0: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
b7c0: 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e   1] = ccc_curr->
b7d0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
b7e0: 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09  ppid & 0xff;....
b7f0: 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20  /* Select found 
b800: 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09  applet ... */...
b810: 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63  select_ret = cac
b820: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
b830: 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64  t(slot, curr_aid
b840: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  , sizeof(curr_ai
b850: 64 29 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63  d));...if (selec
b860: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
b870: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
b880: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b890: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
b8a0: 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b  elect applet, sk
b8b0: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
b8c0: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
b8d0: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
b8e0: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20  ;...}..../* ... 
b8f0: 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
b900: 29 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65  ) */...select_re
b910: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
b920: 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63  t_file(slot, ccc
b930: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b940: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
b950: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
b960: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
b970: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
b980: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b990: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
b9a0: 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67  t file, skipping
b9b0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
b9c0: 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  his object");...
b9d0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
b9e0: 0a 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .../* Process th
b9f0: 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f  is file's TLV lo
ba00: 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66  oking for certif
ba10: 69 63 61 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f  icates */...app_
ba20: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
ba30: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
ba40: 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20  for (app_curr = 
ba50: 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72  app_tlv; app_cur
ba60: 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70  r; app_curr = ap
ba70: 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  p_curr->_next) {
ba80: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ba90: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
baa0: 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ag: %s", CACKEY_
bab0: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
bac0: 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e  O_STR(app_curr->
bad0: 74 61 67 29 29 3b 0a 09 09 09 69 66 20 28 61 70  tag));....if (ap
bae0: 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47  p_curr->tag != G
baf0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
bb00: 43 41 54 45 29 20 7b 0a 09 09 09 09 43 41 43 4b  CATE) {.....CACK
bb10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bb20: 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
bb30: 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
bb40: 20 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41   about CERTIFICA
bb50: 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e  TEs)");......con
bb60: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
bb70: 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
bb80: 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74  [outidx];....out
bb90: 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70  idx++;.....memcp
bba0: 79 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  y(curr_id->apple
bbb0: 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
bbc0: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
bbd0: 6c 65 74 29 29 3b 0a 09 09 09 63 75 72 72 5f 69  let));....curr_i
bbe0: 64 2d 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75  d->file = ccc_cu
bbf0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
bc00: 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09  l->objectid;....
bc10: 63 75 72 72 5f 69 64 2d 3e 6c 61 62 65 6c 20 3d  curr_id->label =
bc20: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 43 41 43 4b 45   NULL;.....CACKE
bc30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bc40: 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d  Filling curr_id-
bc50: 3e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74  >applet (%p) wit
bc60: 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63  h %lu bytes:", c
bc70: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
bc80: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
bc90: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
bca0: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 43 41 43  applet));....CAC
bcb0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
bcc0: 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f  UF("VAL:", curr_
bcd0: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65  id->applet, size
bce0: 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  of(curr_id->appl
bcf0: 65 74 29 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  et));.....curr_i
bd00: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
bd10: 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c  en = app_curr->l
bd20: 65 6e 67 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f  ength;.....curr_
bd30: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
bd40: 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
bd50: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
bd60: 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75  n);....memcpy(cu
bd70: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
bd80: 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61  te, app_curr->va
bd90: 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  lue, curr_id->ce
bda0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
bdb0: 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e  ....if (outidx >
bdc0: 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  = *count) {.....
bdd0: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
bde0: 62 6c 65 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75  ble) {......*cou
bdf0: 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65  nt *= 2;......ce
be00: 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65  rts = realloc(ce
be10: 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72  rts, sizeof(*cer
be20: 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b  ts) * (*count));
be30: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
be40: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
be50: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ...}...}....cack
be60: 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f  ey_free_tlv(app_
be70: 74 6c 76 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74  tlv);....if (out
be80: 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
be90: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
bea0: 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  }...cackey_free_
beb0: 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09  tlv(ccc_tlv);...
bec0: 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b  *count = outidx;
bed0: 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
bee0: 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74  izable) {...cert
bef0: 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74  s = realloc(cert
bf00: 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  s, sizeof(*certs
bf10: 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09  ) * (*count));..
bf20: 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  }.../* Terminate
bf30: 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
bf40: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
bf50: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
bf60: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72  n(slot);...retur
bf70: 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a  n(certs);.}../*.
bf80: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
bf90: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
bfa0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
bfb0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
bfc0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
bfd0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
bfe0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
bff0: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
c000: 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
c010: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c020: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
c030: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
c040: 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
c050: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
c060: 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75  size_t buflen, u
c070: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
c080: 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74  tbuf, size_t out
c090: 62 75 66 6c 65 6e 29 20 7b 0a 09 63 61 63 6b 65  buflen) {..cacke
c0a0: 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a  y_ret send_ret;.
c0b0: 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45  .int le;...CACKE
c0c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c0d0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
c0e0: 28 62 75 66 6c 65 6e 20 3e 20 32 35 35 29 20 7b  (buflen > 255) {
c0f0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c100: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
c110: 62 75 66 6c 65 6e 20 69 73 20 67 72 65 61 74 65  buflen is greate
c120: 72 20 74 68 61 6e 20 32 35 35 20 28 62 75 66 6c  r than 255 (bufl
c130: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73  en = %lu)", (uns
c140: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c  igned long) bufl
c150: 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  en);....return(-
c160: 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74  1);..}...if (out
c170: 62 75 66 6c 65 6e 20 3e 20 32 35 33 29 20 7b 0a  buflen > 253) {.
c180: 09 09 6c 65 20 3d 20 32 35 33 3b 0a 09 7d 20 65  ..le = 253;..} e
c190: 6c 73 65 20 7b 0a 09 09 6c 65 20 3d 20 6f 75 74  lse {...le = out
c1a0: 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20  buflen;..}...if 
c1b0: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
c1c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c1d0: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
c1e0: 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  slot is NULL");.
c1f0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c200: 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e  }...if (buf == N
c210: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
c220: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
c230: 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c  ror.  buf is NUL
c240: 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
c250: 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74  1);..}...if (out
c260: 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  buf == NULL) {..
c270: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c280: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75  INTF("Error.  ou
c290: 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tbuf is NULL");.
c2a0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c2b0: 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  }...if (identity
c2c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
c2d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c2e0: 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74  F("Error.  ident
c2f0: 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  ity is NULL");..
c300: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
c310: 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
c320: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  >pcsc_identity =
c330: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
c340: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c350: 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74  "Error.  identit
c360: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
c370: 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
c380: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
c390: 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63  /* Begin transac
c3a0: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
c3b0: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
c3c0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65  n(slot);.../* Se
c3d0: 6c 65 63 74 20 63 6f 72 72 65 63 74 20 61 70 70  lect correct app
c3e0: 6c 65 74 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44  let */..CACKEY_D
c3f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c  EBUG_PRINTF("Sel
c400: 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f  ecting applet fo
c410: 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20  und at %p ...", 
c420: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
c430: 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 29  dentity->applet)
c440: 3b 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  ;..cackey_select
c450: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64  _applet(slot, id
c460: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
c470: 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 2c 20 73  ntity->applet, s
c480: 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e  izeof(identity->
c490: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61  pcsc_identity->a
c4a0: 70 70 6c 65 74 29 29 3b 0a 0a 09 2f 2a 20 53 65  pplet));.../* Se
c4b0: 6c 65 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c  lect correct fil
c4c0: 65 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 73 65 6c  e */..cackey_sel
c4d0: 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69  ect_file(slot, i
c4e0: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
c4f0: 65 6e 74 69 74 79 2d 3e 66 69 6c 65 29 3b 0a 0a  entity->file);..
c500: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
c510: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
c520: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
c530: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
c540: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e  GSCIS_INSTR_SIGN
c550: 44 45 43 52 59 50 54 2c 20 30 78 30 30 2c 20 30  DECRYPT, 0x00, 0
c560: 78 30 30 2c 20 62 75 66 6c 65 6e 2c 20 62 75 66  x00, buflen, buf
c570: 2c 20 6c 65 2c 20 4e 55 4c 4c 2c 20 6f 75 74 62  , le, NULL, outb
c580: 75 66 2c 20 26 6f 75 74 62 75 66 6c 65 6e 29 3b  uf, &outbuflen);
c590: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
c5a0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
c5b0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
c5c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
c5d0: 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64  U Sending Failed
c5e0: 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e   -- returning in
c5f0: 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 2f 2a   error.");..../*
c600: 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   End transaction
c610: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
c620: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
c630: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
c640: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 74  );..}.../* End t
c650: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
c660: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
c670: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69  ction(slot);..#i
c680: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
c690: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
c6a0: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
c6b0: 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20  if (outbuflen > 
c6c0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
c6d0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c6e0: 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62 75  UG_PRINTF("Outbu
c6f0: 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61 78  flen exceeds max
c700: 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
c710: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
c720: 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 75  . (max = %li, ou
c730: 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c  tbuflen = %lu)",
c740: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
c750: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
c760: 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66  ned long) outbuf
c770: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
c780: 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66  -1);..}.#  endif
c790: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
c7a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
c7b0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
c7c0: 65 73 73 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e  ess.");...return
c7d0: 28 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 7d 0a 0a  (outbuflen);.}..
c7e0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
c7f0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
c800: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
c810: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
c820: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
c830: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
c840: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
c850: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
c860: 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  et cackey_login(
c870: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c880: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
c890: 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e  ed char *pin, un
c8a0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f  signed long pin_
c8b0: 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f  len, int *tries_
c8c0: 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
c8d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61  unsigned char ca
c8e0: 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46  c_pin[8] = {0xFF
c8f0: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
c900: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
c910: 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69  0xFF, 0xFF};..ui
c920: 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f  nt16_t response_
c930: 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73  code;..int tries
c940: 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74  _remaining;..int
c950: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20   send_ret;.../* 
c960: 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65  Indicate that we
c970: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f   do not know abo
c980: 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65  ut how many trie
c990: 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20  s are remaining 
c9a0: 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65  */..if (tries_re
c9b0: 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a  maining_p) {...*
c9c0: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
c9d0: 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20  p = -1;..}.../* 
c9e0: 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20  Apparently, CAC 
c9f0: 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c  PINs are *EXACTL
ca00: 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20  Y* 8 bytes long 
ca10: 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46  -- pad with 0xFF
ca20: 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f   if too short */
ca30: 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d  ..if (pin_len >=
ca40: 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63   8) {...memcpy(c
ca50: 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b  ac_pin, pin, 8);
ca60: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d  ..} else {...mem
ca70: 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e  cpy(cac_pin, pin
ca80: 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a  , pin_len);..}..
ca90: 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65  ./* Issue PIN Ve
caa0: 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  rify */..send_re
cab0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
cac0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
cad0: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
cae0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49  GSCIS_INSTR_VERI
caf0: 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  FY, 0x00, 0x00, 
cb00: 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c  sizeof(cac_pin),
cb10: 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20   cac_pin, 0x00, 
cb20: 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20  &response_code, 
cb30: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
cb40: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
cb50: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
cb60: 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73  {...if ((respons
cb70: 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29  e_code & 0x63C0)
cb80: 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09   == 0x63C0) {...
cb90: 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  .tries_remaining
cba0: 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64   = (response_cod
cbb0: 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41  e & 0xF);.....CA
cbc0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cbd0: 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
cbe0: 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74  ion failed, %i t
cbf0: 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c  ries remaining",
cc00: 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
cc10: 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  );.....if (tries
cc20: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
cc30: 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69  ....*tries_remai
cc40: 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72  ning_p = tries_r
cc50: 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a  emaining;....}..
cc60: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
cc70: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
cc80: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70  ...}....if (resp
cc90: 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36  onse_code == 0x6
cca0: 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  983) {....CACKEY
ccb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
ccc0: 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
ccd0: 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69  failed, device i
cce0: 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09  s locked");.....
ccf0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
cd00: 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  SC_E_LOCKED);...
cd10: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  }....return(CACK
cd20: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
cd30: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
cd40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
cd50: 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73  N Verification s
cd60: 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65  ucceeded");...re
cd70: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
cd80: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
cd90: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
cda0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
cdb0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
cdc0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
cdd0: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
cde0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
cdf0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
ce00: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
ce10: 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
ce20: 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  nt(struct cackey
ce30: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
ce40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 63  unsigned char cc
ce50: 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53  c_aid[] = {GSCIS
ce60: 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 69 6e 74 20  _AID_CCC};..int 
ce70: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 53  send_ret;.../* S
ce80: 65 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70  elect the CCC Ap
ce90: 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  plet */..send_re
cea0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
ceb0: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
cec0: 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  cc_aid, sizeof(c
ced0: 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73  cc_aid));..if (s
cee0: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
cef0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
cf00: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
cf10: 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_S_TOKENABSEN
cf20: 54 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  T);..}...return(
cf30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
cf40: 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a  KENPRESENT);.}..
cf50: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
cf60: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
cf70: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
cf80: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
cf90: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
cfa0: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
cfb0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
cfc0: 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
cfd0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
cfe0: 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74  tity_to_label(st
cff0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
d000: 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
d010: 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ity, unsigned ch
d020: 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75  ar *label_buf, u
d030: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62  nsigned long lab
d040: 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75  el_buf_len) {..u
d050: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72  nsigned long cer
d060: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 63  tificate_len;..c
d070: 68 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b  har *label_asn1;
d080: 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63  ..void *certific
d090: 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72  ate;..int x509_r
d0a0: 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69  ead_ret;...certi
d0b0: 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
d0c0: 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
d0d0: 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
d0e0: 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
d0f0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
d100: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
d110: 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  len < 0) {...ret
d120: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35  urn(-1);..}...x5
d130: 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
d140: 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
d150: 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
d160: 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69  ficate_len, (voi
d170: 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e  d **) &label_asn
d180: 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  1);..if (x509_re
d190: 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
d1a0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
d1b0: 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
d1c0: 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
d1d0: 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
d1e0: 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
d1f0: 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
d200: 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
d210: 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30   "CN");..if (x50
d220: 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29  9_read_ret <= 0)
d230: 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72   {...x509_read_r
d240: 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f  et = x509_dn_to_
d250: 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e  string(label_asn
d260: 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
d270: 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c  , (char *) label
d280: 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f  _buf, label_buf_
d290: 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69  len, NULL);....i
d2a0: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
d2b0: 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75   <= 0) {....retu
d2c0: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
d2d0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
d2e0: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
d2f0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
d300: 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
d310: 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  ret > _POSIX_SSI
d320: 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
d330: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d340: 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65  "x509_read_ret e
d350: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
d360: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
d370: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
d380: 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61   = %li, x509_rea
d390: 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28  d_ret = %lu)", (
d3a0: 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49  long) _POSIX_SSI
d3b0: 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65  ZE_MAX, (unsigne
d3c0: 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61  d long) x509_rea
d3d0: 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  d_ret);....retur
d3e0: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
d3f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75  if.#endif...retu
d400: 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  rn(x509_read_ret
d410: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
d420: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
d430: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
d440: 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
d450: 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a  void **mutex) {.
d460: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
d470: 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
d480: 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
d490: 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
d4a0: 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
d4b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d4c0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
d4d0: 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
d4e0: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
d4f0: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
d500: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
d510: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
d520: 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  tex = malloc(siz
d530: 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74  eof(*pthread_mut
d540: 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68  ex));...if (!pth
d550: 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09  read_mutex) {...
d560: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d570: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
d580: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e  allocate memory.
d590: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
d5a0: 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65  1);...}....pthre
d5b0: 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
d5c0: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70  ead_mutex_init(p
d5d0: 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55  thread_mutex, NU
d5e0: 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  LL);...if (pthre
d5f0: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
d600: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
d610: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
d620: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72  d_mutex_init() r
d630: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
d640: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
d650: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
d660: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d  n(-1);...}....*m
d670: 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d  utex = pthread_m
d680: 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  utex;..} else {.
d690: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67  ..if (cackey_arg
d6a0: 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b  s.CreateMutex) {
d6b0: 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61  ....custom_retva
d6c0: 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e  l = cackey_args.
d6d0: 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65  CreateMutex(mute
d6e0: 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
d6f0: 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
d700: 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
d710: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d720: 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
d730: 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  teMutex() return
d740: 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
d750: 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
d760: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
d770: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
d780: 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
d790: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
d7a0: 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
d7b0: 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
d7c0: 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  rn(0);.}../* Ret
d7d0: 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
d7e0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
d7f0: 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
d800: 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b  k(void *mutex) {
d810: 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
d820: 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
d830: 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
d840: 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
d850: 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
d860: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d870: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
d880: 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
d890: 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
d8a0: 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
d8b0: 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
d8c0: 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
d8d0: 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09  utex = mutex;...
d8e0: 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
d8f0: 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
d900: 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74  lock(pthread_mut
d910: 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  ex);...if (pthre
d920: 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
d930: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
d940: 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
d950: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72  d_mutex_lock() r
d960: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
d970: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
d980: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
d990: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n(-1);...}..} el
d9a0: 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
d9b0: 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
d9c0: 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
d9d0: 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
d9e0: 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74  gs.LockMutex(mut
d9f0: 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
da00: 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
da10: 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
da20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
da30: 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  "cackey_args.Loc
da40: 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  kMutex() returne
da50: 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
da60: 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
da70: 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
da80: 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
da90: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
daa0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
dab0: 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
dac0: 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
dad0: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  n(0);.}../* Retu
dae0: 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
daf0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
db00: 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
db10: 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20  ck(void *mutex) 
db20: 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
db30: 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
db40: 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
db50: 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
db60: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
db70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
db80: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
db90: 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
dba0: 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
dbb0: 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
dbc0: 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
dbd0: 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
dbe0: 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a  mutex = mutex;..
dbf0: 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
dc00: 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
dc10: 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  _unlock(pthread_
dc20: 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
dc30: 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
dc40: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
dc50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
dc60: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
dc70: 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  k() returned err
dc80: 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
dc90: 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
dca0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
dcb0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
dcc0: 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
dcd0: 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  ckMutex) {....cu
dce0: 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
dcf0: 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
dd00: 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
dd10: 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
dd20: 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
dd30: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
dd40: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
dd50: 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
dd60: 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
dd70: 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
dd80: 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
dd90: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
dda0: 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
ddb0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ddc0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
ddd0: 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
dde0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
ddf0: 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54  .}..static CK_AT
de00: 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b  TRIBUTE_PTR cack
de10: 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
de20: 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  s(CK_OBJECT_CLAS
de30: 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73  S objectclass, s
de40: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
de50: 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
de60: 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c  tity, unsigned l
de70: 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ong identity_num
de80: 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
de90: 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74  ulCount) {..stat
dea0: 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74  ic CK_BBOOL ck_t
deb0: 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63  rue = 1;..static
dec0: 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c   CK_BBOOL ck_fal
ded0: 73 65 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e  se = 0;..CK_ULON
dee0: 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20  G numattrs = 0, 
def0: 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43  retval_count;..C
df00: 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  K_ATTRIBUTE_TYPE
df10: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
df20: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63  ..CK_ATTRIBUTE c
df30: 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61  urr_attr, *retva
df40: 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  l;..CK_VOID_PTR 
df50: 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
df60: 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43  G ulValueLen;..C
df70: 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63  K_OBJECT_CLASS c
df80: 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
df90: 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  .CK_CERTIFICATE_
dfa0: 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63  TYPE ck_certific
dfb0: 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45  ate_type;..CK_KE
dfc0: 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79  Y_TYPE ck_key_ty
dfd0: 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52  pe;..CK_UTF8CHAR
dfe0: 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b   ucTmpBuf[1024];
dff0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
e000: 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73  *certificate;..s
e010: 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61  size_t certifica
e020: 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30  te_len = -1, x50
e030: 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74  9_read_ret;..int
e040: 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09   pValue_free;...
e050: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e060: 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a  NTF("Called (obj
e070: 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20  ectClass = %lu, 
e080: 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25  identity_num = %
e090: 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
e0a0: 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61   long) objectcla
e0b0: 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ss, identity_num
e0c0: 29 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63  );...if (objectc
e0d0: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
e0e0: 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
e0f0: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55  tclass != CKO_PU
e100: 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65  BLIC_KEY && obje
e110: 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
e120: 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
e130: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e140: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
e150: 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
e160: 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20   invalid object 
e170: 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75  class");....retu
e180: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
e190: 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69  * Get Cert */..i
e1a0: 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
e1b0: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
e1c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e1d0: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
e1e0: 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69  s (NULL), invali
e1f0: 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64  d identiy provid
e200: 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ed");....return(
e210: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74  NULL);..}...cert
e220: 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69  ificate = identi
e230: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b  ty->certificate;
e240: 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ..certificate_le
e250: 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  n = identity->ce
e260: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
e270: 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
e280: 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65  _len == -1 || ce
e290: 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c  rtificate == NUL
e2a0: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
e2b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
e2c0: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
e2d0: 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65  (NULL), this ide
e2e0: 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68  ntity does not h
e2f0: 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72  ave an X.509 cer
e300: 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61  tificate associa
e310: 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20  ted with it and 
e320: 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b  will not work");
e330: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
e340: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
e350: 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74   that certificat
e360: 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64  e is ASN.1 encod
e370: 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  ed X.509 certifi
e380: 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30  cate */..if (x50
e390: 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74  9_to_serial(cert
e3a0: 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
e3b0: 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20  cate_len, NULL) 
e3c0: 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 0) {...CACKEY_
e3d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e3e0: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
e3f0: 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e  s (NULL), the X.
e400: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
e410: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
e420: 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73  this identity is
e430: 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09   not valid");...
e440: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
e450: 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74  }...retval_count
e460: 20 3d 20 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d   = 16;..retval =
e470: 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63   malloc(retval_c
e480: 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72  ount * sizeof(*r
e490: 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28  etval));...for (
e4a0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
e4b0: 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79   0; curr_attr_ty
e4c0: 70 65 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b  pe < 0xce53635f;
e4d0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b   curr_attr_type+
e4e0: 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f  +) {...if (curr_
e4f0: 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38  attr_type == 0x8
e500: 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74  00) {....curr_at
e510: 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33  tr_type = 0xce53
e520: 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61  6300;...}....pVa
e530: 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09  lue_free = 0;...
e540: 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
e550: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
e560: 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73  K_LONG) -1;....s
e570: 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72  witch (curr_attr
e580: 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  _type) {....case
e590: 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09   CKA_CLASS:.....
e5a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e5b0: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
e5c0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c  attribute CKA_CL
e5d0: 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASS (0x%08lx) ..
e5e0: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
e5f0: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
e600: 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a  pe);......ck_obj
e610: 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65  ect_class = obje
e620: 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56  ctclass;......pV
e630: 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63  alue = &ck_objec
e640: 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56  t_class;.....ulV
e650: 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
e660: 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  (ck_object_class
e670: 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
e680: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
e690: 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
e6a0: 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
e6b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
e6c0: 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29  _OBJECT_CLASS *)
e6d0: 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
e6e0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e6f0: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
e700: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
e710: 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09  se CKA_TOKEN:...
e720: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e730: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
e740: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
e750: 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20  TOKEN (0x%08lx) 
e760: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
e770: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
e780: 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
e790: 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
e7a0: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
e7b0: 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
e7c0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
e7d0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
e7e0: 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
e7f0: 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
e800: 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
e810: 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
e820: 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
e830: 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
e840: 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
e850: 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
e860: 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41  DIFIABLE:.....CA
e870: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e880: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
e890: 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49  tribute CKA_MODI
e8a0: 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29  FIABLE (0x%08lx)
e8b0: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
e8c0: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
e8d0: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
e8e0: 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
e8f0: 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
e900: 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
e910: 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
e920: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
e930: 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
e940: 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
e950: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
e960: 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
e970: 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
e980: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
e990: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
e9a0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
e9b0: 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b  _LABEL:.....CACK
e9c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e9d0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
e9e0: 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20  ibute CKA_LABEL 
e9f0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
ea00: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ea10: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
ea20: 0a 0a 09 09 09 09 2f 2a 20 44 65 74 65 72 6d 69  ....../* Determi
ea30: 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 78  ne name */.....x
ea40: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 63  509_read_ret = c
ea50: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
ea60: 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 69 64 65  ity_to_label(ide
ea70: 6e 74 69 74 79 2c 20 75 63 54 6d 70 42 75 66 2c  ntity, ucTmpBuf,
ea80: 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66   sizeof(ucTmpBuf
ea90: 29 29 3b 0a 09 09 09 09 69 66 20 28 78 35 30 39  ));.....if (x509
eaa0: 5f 72 65 61 64 5f 72 65 74 20 3e 20 30 29 20 7b  _read_ret > 0) {
eab0: 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75  ......pValue = u
eac0: 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 09 75 6c  cTmpBuf;......ul
ead0: 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
eae0: 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 7d 0a  read_ret;.....}.
eaf0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
eb00: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
eb10: 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
eb20: 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
eb30: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
eb40: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
eb50: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
eb60: 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b  _VALUE:.....CACK
eb70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
eb80: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
eb90: 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20  ibute CKA_VALUE 
eba0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
ebb0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ebc0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
ebd0: 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62  ......switch (ob
ebe0: 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09  jectclass) {....
ebf0: 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41  ..case CKO_PRIVA
ec00: 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41  TE_KEY:.......CA
ec10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ec20: 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
ec30: 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
ec40: 73 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76  se we are a priv
ec50: 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09  ate key.");.....
ec60: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
ec70: 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b  ase CKO_PUBLIC_K
ec80: 45 59 3a 0a 09 09 09 09 09 09 2f 2a 20 58 58 58  EY:......./* XXX
ec90: 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09 09 09  : TODO */.......
eca0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
ecb0: 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  e CKO_CERTIFICAT
ecc0: 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20  E:.......pValue 
ecd0: 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  = certificate;..
ece0: 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
ecf0: 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  = certificate_le
ed00: 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  n;........break;
ed10: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
ed20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ed30: 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
ed40: 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
ed50: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ed60: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
ed70: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
ed80: 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09  e CKA_ISSUER:...
ed90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
eda0: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
edb0: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
edc0: 49 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29  ISSUER (0x%08lx)
edd0: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
ede0: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
edf0: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
ee00: 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
ee10: 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
ee20: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
ee30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
ee40: 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
ee50: 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
ee60: 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
ee70: 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09  icate.");.......
ee80: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
ee90: 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
eea0: 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
eeb0: 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
eec0: 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65   = x509_to_issue
eed0: 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  r(certificate, c
eee0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
eef0: 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
ef00: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
ef10: 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
ef20: 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
ef30: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
ef40: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
ef50: 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
ef60: 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
ef70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ef80: 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
ef90: 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
efa0: 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
efb0: 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
efc0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
efd0: 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  case CKA_SERIAL_
efe0: 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b  NUMBER:.....CACK
eff0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f000: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
f010: 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c  ibute CKA_SERIAL
f020: 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78  _NUMBER (0x%08lx
f030: 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
f040: 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
f050: 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
f060: 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
f070: 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
f080: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
f090: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
f0a0: 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
f0b0: 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
f0c0: 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
f0d0: 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09  ficate.");......
f0e0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
f0f0: 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
f100: 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
f110: 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
f120: 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69  t = x509_to_seri
f130: 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
f140: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
f150: 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
f160: 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
f170: 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
f180: 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
f190: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
f1a0: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
f1b0: 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
f1c0: 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
f1d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f1e0: 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
f1f0: 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
f200: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
f210: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
f220: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
f230: 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a  ...case CKA_SUBJ
f240: 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ECT:.....CACKEY_
f250: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f260: 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
f270: 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28  te CKA_SUBJECT (
f280: 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
f290: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
f2a0: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
f2b0: 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
f2c0: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
f2d0: 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09  IFICATE) {......
f2e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f2f0: 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
f300: 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
f310: 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
f320: 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29  a certificate.")
f330: 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
f340: 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
f350: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
f360: 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
f370: 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
f380: 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69  to_subject(certi
f390: 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
f3a0: 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
f3b0: 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
f3c0: 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
f3d0: 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
f3e0: 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
f3f0: 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
f400: 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
f410: 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
f420: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
f430: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
f440: 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
f450: 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
f460: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
f470: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
f480: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
f490: 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59  A_ID:.....CACKEY
f4a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
f4b0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
f4c0: 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30  ute CKA_ID (0x%0
f4d0: 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
f4e0: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
f4f0: 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
f500: 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28  .ucTmpBuf[0] = (
f510: 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20  (identity_num + 
f520: 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  1) >> 8) & 0xff;
f530: 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d  .....ucTmpBuf[1]
f540: 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75   =  (identity_nu
f550: 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a  m + 1) & 0xff;..
f560: 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63  ....pValue = &uc
f570: 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61  TmpBuf;.....ulVa
f580: 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09  lueLen = 2;.....
f590: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f5a0: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
f5b0: 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
f5c0: 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
f5d0: 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
f5e0: 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
f5f0: 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49  ..case CKA_CERTI
f600: 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09  FICATE_TYPE:....
f610: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f620: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
f630: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
f640: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
f650: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
f660: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f670: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
f680: 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
f690: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
f6a0: 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
f6b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f6c0: 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
f6d0: 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
f6e0: 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
f6f0: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22   a certificate."
f700: 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
f710: 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
f720: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e   only support on
f730: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 79  e certificate ty
f740: 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72  pe */.....ck_cer
f750: 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20  tificate_type = 
f760: 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09  CKC_X_509;......
f770: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72  pValue = &ck_cer
f780: 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09  tificate_type;..
f790: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
f7a0: 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66  sizeof(ck_certif
f7b0: 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09  icate_type);....
f7c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f7d0: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
f7e0: 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20  rning CKC_X_509 
f7f0: 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c  (%lu) (%p/%lu)",
f800: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
f810: 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41   *((CK_CERTIFICA
f820: 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75  TE_TYPE *) pValu
f830: 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
f840: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
f850: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
f860: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
f870: 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43  _KEY_TYPE:.....C
f880: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f890: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
f8a0: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59  ttribute CKA_KEY
f8b0: 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20  _TYPE (0x%08lx) 
f8c0: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
f8d0: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
f8e0: 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
f8f0: 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
f900: 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26  KO_PRIVATE_KEY &
f910: 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
f920: 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29   CKO_PUBLIC_KEY)
f930: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
f940: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
f950: 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
f960: 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
f970: 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29  are not a key.")
f980: 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
f990: 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20  ...}....../* We 
f9a0: 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65  only support one
f9b0: 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09   key type */....
f9c0: 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43  .ck_key_type = C
f9d0: 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61  KK_RSA;......pVa
f9e0: 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79  lue = &ck_key_ty
f9f0: 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  pe;.....ulValueL
fa00: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b  en = sizeof(ck_k
fa10: 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43  ey_type);......C
fa20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
fa30: 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
fa40: 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29  ng CKK_RSA (%lu)
fa50: 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
fa60: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
fa70: 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
fa80: 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  PE *) pValue), p
fa90: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
faa0: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
fab0: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
fac0: 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
fad0: 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
fae0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
faf0: 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
fb00: 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c  CKA_SIGN (0x%08l
fb10: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
fb20: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
fb30: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
fb40: 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
fb50: 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
fb60: 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
fb70: 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
fb80: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
fb90: 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
fba0: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
fbb0: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
fbc0: 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
fbd0: 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
fbe0: 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
fbf0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
fc00: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
fc10: 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
fc20: 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
fc30: 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
fc40: 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
fc50: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
fc60: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
fc70: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
fc80: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43  ....case CKA_DEC
fc90: 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  RYPT:.....CACKEY
fca0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
fcb0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
fcc0: 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20  ute CKA_DECRYPT 
fcd0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
fce0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
fcf0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
fd00: 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
fd10: 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
fd20: 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65  VATE_KEY || obje
fd30: 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
fd40: 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09  UBLIC_KEY) {....
fd50: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
fd60: 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
fd70: 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
fd80: 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
fd90: 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
fda0: 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
fdb0: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
fdc0: 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
fdd0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
fde0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fdf0: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
fe00: 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
fe10: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
fe20: 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
fe30: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
fe40: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
fe50: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
fe60: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
fe70: 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45   CKA_TRUST_SERVE
fe80: 52 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b  R_AUTH:.....CACK
fe90: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fea0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
feb0: 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
fec0: 53 45 52 56 45 52 5f 41 55 54 48 20 28 30 78 25  SERVER_AUTH (0x%
fed0: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
fee0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
fef0: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
ff00: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
ff10: 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
ff20: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
ff30: 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
ff40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ff50: 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
ff60: 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
ff70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
ff80: 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
ff90: 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
ffa0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
ffb0: 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
ffc0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
ffd0: 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54  CKA_TRUST_CLIENT
ffe0: 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b 45  _AUTH:.....CACKE
fff0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10000 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
10010 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  bute CKA_TRUST_C
10020 4c 49 45 4e 54 5f 41 55 54 48 20 28 30 78 25 30  LIENT_AUTH (0x%0
10030 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
10040 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
10050 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
10060 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
10070 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
10080 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
10090 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
100a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
100b0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
100c0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
100d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
100e0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
100f0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
10100 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
10110 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
10120 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
10130 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49  KA_TRUST_CODE_SI
10140 47 4e 49 4e 47 3a 0a 09 09 09 09 43 41 43 4b 45  GNING:.....CACKE
10150 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10160 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
10170 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  bute CKA_TRUST_C
10180 4f 44 45 5f 53 49 47 4e 49 4e 47 20 28 30 78 25  ODE_SIGNING (0x%
10190 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
101a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
101b0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
101c0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
101d0 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
101e0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
101f0 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
10200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10210 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
10220 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
10230 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
10240 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
10250 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
10260 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
10270 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
10280 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
10290 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f  CKA_TRUST_EMAIL_
102a0 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09  PROTECTION:.....
102b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
102c0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
102d0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
102e0 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43  UST_EMAIL_PROTEC
102f0 54 49 4f 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  TION (0x%08lx) .
10300 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
10310 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
10320 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
10330 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
10340 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
10350 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
10360 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10370 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
10380 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
10390 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
103a0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
103b0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
103c0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
103d0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
103e0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
103f0 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
10400 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
10410 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
10420 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09   (CK_LONG) -1;..
10430 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
10440 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20  .if (((CK_LONG) 
10450 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28  ulValueLen) != (
10460 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b  (CK_LONG) -1)) {
10470 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72  ..../* Push curr
10480 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73  _attr onto the s
10490 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f  tack */....curr_
104a0 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72  attr.type = curr
104b0 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63  _attr_type;....c
104c0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
104d0 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  Len = ulValueLen
104e0 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  ;.....curr_attr.
104f0 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
10500 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
10510 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79  eLen);....memcpy
10520 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  (curr_attr.pValu
10530 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  e, pValue, curr_
10540 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
10550 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65  ;.....if (pValue
10560 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29  _free && pValue)
10570 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c   {.....free(pVal
10580 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ue);....}.....if
10590 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65   (numattrs >= re
105a0 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  tval_count) {...
105b0 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  ..retval_count *
105c0 3d 20 32 3b 0a 09 09 09 09 72 65 74 76 61 6c 20  = 2;.....retval 
105d0 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c  = realloc(retval
105e0 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  , retval_count *
105f0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
10600 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
10610 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74  py(&retval[numat
10620 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72  trs], &curr_attr
10630 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74  , sizeof(curr_at
10640 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72  tr));....numattr
10650 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  s++;...}..}...if
10660 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29   (numattrs != 0)
10670 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e   {...retval_coun
10680 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09  t = numattrs;...
10690 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63  retval = realloc
106a0 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f  (retval, retval_
106b0 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
106c0 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73  retval));..} els
106d0 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61  e {...free(retva
106e0 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20  l);....retval = 
106f0 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43  NULL;..}...*pulC
10700 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
10710 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10720 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
10730 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25  g %lu objects (%
10740 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20  p).", numattrs, 
10750 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
10760 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
10770 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
10780 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
10790 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  (struct cackey_i
107a0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
107b0 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ies, unsigned lo
107c0 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  ng identities_co
107d0 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49  unt) {..CK_ATTRI
107e0 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
107f0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
10800 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78  id_idx, attr_idx
10810 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69  ;...if (identiti
10820 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64  es == NULL || id
10830 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
10840 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  = 0) {...return;
10850 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64  ..}...for (id_id
10860 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20  x = 0; id_idx < 
10870 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
10880 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  ; id_idx++) {...
10890 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69  if (identities[i
108a0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
108b0 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74  s) {....for (att
108c0 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f  r_idx = 0; attr_
108d0 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73  idx < identities
108e0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
108f0 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f  tes_count; attr_
10900 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72  idx++) {.....cur
10910 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69  r_attr = &identi
10920 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
10930 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78  ributes[attr_idx
10940 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72  ];......if (curr
10950 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b  _attr->pValue) {
10960 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f  ......free(curr_
10970 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09  attr->pValue);..
10980 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
10990 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
109a0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
109b0 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e   {.....free(iden
109c0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
109d0 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d  ttributes);....}
109e0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
109f0 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 69 65  _certs(identitie
10a00 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
10a10 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a  dentity, 1, 1);.
10a20 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64  ..}..}...free(id
10a30 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74  entities);.}..st
10a40 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
10a50 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  ey_identity *cac
10a60 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
10a70 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
10a80 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
10a90 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73  signed long *ids
10aa0 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63  _found) {..struc
10ab0 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
10ac0 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
10ad0 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74  ntities;..struct
10ae0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
10af0 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
10b00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
10b10 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75  _ids, id_idx, cu
10b20 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73  rr_id_type;..uns
10b30 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
10b40 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a  erts, cert_idx;.
10b50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10b60 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
10b70 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e  ;...if (ids_foun
10b80 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d == NULL) {...C
10b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10ba0 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f  TF("Error.  ids_
10bb0 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b  found is NULL");
10bc0 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
10bd0 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e  ;..}...pcsc_iden
10be0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
10bf0 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c  read_certs(slot,
10c00 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
10c10 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64  s);..if (pcsc_id
10c20 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
10c30 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74  ) {.../* Convert
10c40 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73   number of Certs
10c50 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62   to number of ob
10c60 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69  jects */...num_i
10c70 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54  ds = (CKO_PRIVAT
10c80 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54  E_KEY - CKO_CERT
10c90 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e  IFICATE + 1) * n
10ca0 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 64 65  um_certs;....ide
10cb0 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63  ntities = malloc
10cc0 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f  (num_ids * sizeo
10cd0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b  f(*identities));
10ce0 0a 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a  ....id_idx = 0;.
10cf0 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20  ..for (cert_idx 
10d00 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20  = 0; cert_idx < 
10d10 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f  num_certs; cert_
10d20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20  idx++) {....for 
10d30 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20  (curr_id_type = 
10d40 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b  CKO_CERTIFICATE;
10d50 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d   curr_id_type <=
10d60 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
10d70 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b  ; curr_id_type++
10d80 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69  ) {.....identiti
10d90 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
10da0 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
10db0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63 75  et_attributes(cu
10dc0 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73  rr_id_type, &pcs
10dd0 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
10de0 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78  t_idx], cert_idx
10df0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
10e00 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
10e10 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 66  _count);......if
10e20 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
10e30 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
10e40 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  == NULL) {......
10e50 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
10e60 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
10e70 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09 7d 0a 0a  unt = 0;.....}..
10e80 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
10e90 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
10ea0 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
10eb0 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
10ec0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
10ed0 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d 65  entity));.....me
10ee0 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
10ef0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
10f00 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64 65  ntity, &pcsc_ide
10f10 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
10f20 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74  ], sizeof(*ident
10f30 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
10f40 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a  sc_identity));..
10f50 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
10f60 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
10f70 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
10f80 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f  e = malloc(pcsc_
10f90 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
10fa0 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
10fb0 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
10fc0 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
10fd0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
10fe0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
10ff0 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
11000 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
11010 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
11020 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
11030 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
11040 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b  n);......id_idx+
11050 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  +;....}...}....c
11060 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
11070 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
11080 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
11090 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d  ....*ids_found =
110a0 20 6e 75 6d 5f 69 64 73 3b 0a 09 09 72 65 74 75   num_ids;...retu
110b0 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a  rn(identities);.
110c0 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20  .}...*ids_found 
110d0 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c  = 0;..return(NUL
110e0 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  L);.}..CK_DEFINE
110f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
11100 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43   C_Initialize)(C
11110 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74  K_VOID_PTR pInit
11120 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e  Args) {..CK_C_IN
11130 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b  ITIALIZE_ARGS CK
11140 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74  _PTR args;..uint
11150 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d  32_t idx;..int m
11160 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a  utex_init_ret;..
11170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11180 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
11190 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67 73  ...if (pInitArgs
111a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72   != NULL) {...ar
111b0 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a  gs = pInitArgs;.
111c0 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79  ..memcpy(&cackey
111d0 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a  _args, args, siz
111e0 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29  eof(cackey_args)
111f0 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e  );....if (args->
11200 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e  CreateMutex == N
11210 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73  ULL || args->Des
11220 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  troyMutex == NUL
11230 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d  L || args->LockM
11240 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
11250 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65  args->UnlockMute
11260 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  x == NULL) {....
11270 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65  if (args->Create
11280 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
11290 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75   args->DestroyMu
112a0 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
112b0 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21  rgs->LockMutex !
112c0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
112d0 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e  UnlockMutex != N
112e0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
112f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11300 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74  Error. Some, but
11310 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69   not All threadi
11320 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72  ng primitives pr
11330 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09  ovided.");......
11340 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
11350 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a  ENTS_BAD);....}.
11360 09 09 7d 0a 0a 09 09 69 66 20 28 61 72 67 73 2d  ..}....if (args-
11370 3e 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  >pReserved != NU
11380 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
11390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
113a0 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69  ror. pReserved i
113b0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
113c0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
113d0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
113e0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  }..} else {...ca
113f0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
11400 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
11410 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74  cackey_args.Dest
11420 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  royMutex = NULL;
11430 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  ...cackey_args.L
11440 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
11450 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  ...cackey_args.U
11460 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c  nlockMutex = NUL
11470 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
11480 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  .flags = 0;..}..
11490 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74  .if (cackey_init
114a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
114b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
114c0 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64  ("Error.  Alread
114d0 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  y initialized.")
114e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
114f0 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59  CRYPTOKI_ALREADY
11500 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
11510 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
11520 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
11530 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
11540 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
11550 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
11560 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
11570 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
11580 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
11590 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
115a0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
115b0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
115c0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
115d0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
115e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
115f0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
11600 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
11610 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  dx].pcsc_reader 
11620 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
11630 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
11640 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
11650 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
11660 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
11670 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b  t = 0;..}...cack
11680 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
11690 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65   1;...if (!cacke
116a0 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20  y_biglock_init) 
116b0 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72  {...mutex_init_r
116c0 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  et = cackey_mute
116d0 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79  x_create(&cackey
116e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
116f0 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74   (mutex_init_ret
11700 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
11710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11720 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69  "Error.  Mutex i
11730 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
11740 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  iled.");.....ret
11750 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43  urn(CKR_CANT_LOC
11760 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  K);...}....cacke
11770 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
11780 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f   1;..}...CACKEY_
11790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
117a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
117b0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
117c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
117d0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
117e0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
117f0 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  Finalize)(CK_VOI
11800 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
11810 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
11820 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
11830 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
11840 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
11850 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
11860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11870 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
11880 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
11890 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
118a0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
118b0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
118c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
118d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
118e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
118f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
11900 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
11910 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
11920 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
11930 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
11940 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
11950 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
11960 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
11970 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
11980 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
11990 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
119a0 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
119b0 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
119c0 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  n(idx);...}..}..
119d0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
119e0 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
119f0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
11a00 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
11a10 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
11a20 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
11a30 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
11a40 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
11a50 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65  ots[idx].pcsc_re
11a60 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28  ader) {....free(
11a70 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
11a80 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ].pcsc_reader);.
11a90 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  ..}..}...cackey_
11aa0 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
11ab0 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  );...cackey_init
11ac0 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43  ialized = 0;...C
11ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ae0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
11af0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
11b00 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
11b10 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
11b20 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
11b30 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43  RV, C_GetInfo)(C
11b40 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  K_INFO_PTR pInfo
11b50 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
11b60 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74  TF8CHAR manufact
11b70 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e  urerID[] = "U.S.
11b80 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73   Government";..s
11b90 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
11ba0 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  R libraryDescrip
11bb0 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
11bc0 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ";...CACKEY_DEBU
11bd0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
11be0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
11bf0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
11c00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11c10 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
11c20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
11c30 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
11c40 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
11c50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
11c60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
11c70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11c80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
11c90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
11ca0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
11cb0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
11cc0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  ZED);..}...pInfo
11cd0 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
11ce0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b  n.major = ((CACK
11cf0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
11d00 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29  ION_CODE) >> 16)
11d10 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
11d20 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
11d30 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45  .minor = ((CACKE
11d40 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
11d50 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26  ON_CODE) >> 8) &
11d60 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28   0xff;...memset(
11d70 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
11d80 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
11d90 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
11da0 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
11db0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
11dc0 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
11dd0 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
11de0 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
11df0 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
11e00 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a  >flags = 0x00;..
11e10 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c  .memset(pInfo->l
11e20 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
11e30 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  n, ' ', sizeof(p
11e40 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
11e50 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
11e60 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  cpy(pInfo->libra
11e70 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c  ryDescription, l
11e80 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
11e90 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72  n, sizeof(librar
11ea0 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  yDescription) - 
11eb0 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  1);...pInfo->lib
11ec0 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  raryVersion.majo
11ed0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
11ee0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
11ef0 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
11f00 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d  libraryVersion.m
11f10 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
11f20 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
11f30 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  ) & 0xff;...CACK
11f40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11f50 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
11f60 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
11f70 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
11f80 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f  K);.}../*. * Pro
11f90 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61  cess list of rea
11fa0 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65  ders, and create
11fb0 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e   mapping between
11fc0 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64   reader name and
11fd0 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f   slot ID. */.CK_
11fe0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
11ff0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
12000 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74  List)(CK_BBOOL t
12010 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f  okenPresent, CK_
12020 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f  SLOT_ID_PTR pSlo
12030 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  tList, CK_ULONG_
12040 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
12050 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
12060 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e  l;..int pcsc_con
12070 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c  nect_ret;..CK_UL
12080 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  ONG count, slot_
12090 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73  count = 0, currs
120a0 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63  lot;..char *pcsc
120b0 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f  _readers, *pcsc_
120c0 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63  readers_s, *pcsc
120d0 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f  _readers_e;..DWO
120e0 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  RD pcsc_readers_
120f0 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
12100 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
12110 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72  ;..size_t curr_r
12120 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43  eader_len;...CAC
12130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12140 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
12150 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
12160 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
12170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
12180 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73  ror. pulCount is
12190 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
121a0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
121b0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
121c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
121d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
121e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
121f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
12200 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
12210 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
12220 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
12230 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
12240 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
12250 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
12260 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
12270 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
12280 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
12290 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
122a0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
122b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
122c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
122d0 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65  OR);..}.../* Cle
122e0 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  ar list of slots
122f0 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69   */..if (pSlotLi
12300 73 74 29 20 7b 0a 09 09 2f 2a 20 4f 6e 6c 79 20  st) {.../* Only 
12310 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
12320 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
12330 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
12340 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  g supply the slo
12350 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
12360 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
12370 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
12380 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c  ;....for (currsl
12390 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
123a0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
123b0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
123c0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
123d0 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
123e0 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79   {....if (cackey
123f0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
12400 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a  .pcsc_reader) {.
12410 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
12420 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
12430 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
12440 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
12450 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
12460 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09  eader = NULL;...
12470 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  .}.....cackey_sl
12480 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
12490 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  tive = 0;...}..}
124a0 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
124b0 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20  list of readers 
124c0 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  */..pcsc_connect
124d0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
124e0 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
124f0 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
12500 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
12510 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
12520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12530 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
12540 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61 73  PC/SC failed, as
12550 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22  suming no slots"
12560 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  );....slot_count
12570 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 0;..} else {.
12580 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  ..pcsc_readers_l
12590 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64  en = 0;....scard
125a0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
125b0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
125c0 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
125d0 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e  _handle, NULL, N
125e0 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ULL, &pcsc_reade
125f0 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73  rs_len);...if (s
12600 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
12610 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
12620 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f  SUCCESS && pcsc_
12630 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30  readers_len != 0
12640 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64  ) {....pcsc_read
12650 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73  ers = malloc(pcs
12660 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
12670 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
12680 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  s = pcsc_readers
12690 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74  ;.....scard_list
126a0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
126b0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
126c0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
126d0 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72  le, NULL, pcsc_r
126e0 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65  eaders, &pcsc_re
126f0 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69  aders_len);....i
12700 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61  f (scard_listrea
12710 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  ders_ret == SCAR
12720 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
12730 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
12740 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  e = pcsc_readers
12750 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   + pcsc_readers_
12760 6c 65 6e 3b 0a 0a 09 09 09 09 63 75 72 72 73 6c  len;......currsl
12770 6f 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c  ot = 0;.....whil
12780 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20  e (pcsc_readers 
12790 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  < pcsc_readers_e
127a0 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 72 65  ) {......curr_re
127b0 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65  ader_len = strle
127c0 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  n(pcsc_readers);
127d0 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73 63  .......if ((pcsc
127e0 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f  _readers + curr_
127f0 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63  reader_len) > pc
12800 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a  sc_readers_e) {.
12810 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
12820 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
12830 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d  rr_reader_len ==
12840 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61   0) {.......brea
12850 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
12860 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20  if (currslot >= 
12870 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
12880 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
12890 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
128a0 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
128b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
128c0 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72  ound more reader
128d0 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65  s than slots are
128e0 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a   available!");..
128f0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
12900 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59  ..}.......CACKEY
12910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
12920 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73 22  ound reader: %s"
12930 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  , pcsc_readers);
12940 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75  ......./* Only u
12950 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f  pdate the list o
12960 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72  f slots if we ar
12970 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  e actually being
12980 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
12990 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
129a0 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69  .....if (pSlotLi
129b0 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61 63 6b  st) {.......cack
129c0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
129d0 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  t].active = 1;..
129e0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
129f0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
12a00 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70  _reader = strdup
12a10 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a  (pcsc_readers);.
12a20 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
12a30 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
12a40 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
12a50 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b   = 0;.......cack
12a60 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
12a70 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t].transaction_d
12a80 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09  epth = 0;.......
12a90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
12aa0 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65  rslot].slot_rese
12ab0 74 20 3d 20 31 3b 0a 09 09 09 09 09 7d 0a 09 09  t = 1;......}...
12ac0 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
12ad0 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
12ae0 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
12af0 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
12b00 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
12b10 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  t > 0) {......sl
12b20 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72 73  ot_count = currs
12b30 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  lot;.....}....} 
12b40 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
12b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12b60 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53  Second call to S
12b70 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20  CardListReaders 
12b80 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25  failed, return %
12b90 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44  s/%li", CACKEY_D
12ba0 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
12bb0 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
12bc0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
12bd0 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c  , (long) scard_l
12be0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b  istreaders_ret);
12bf0 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70  ....}.....free(p
12c00 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a  csc_readers_s);.
12c10 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
12c20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12c30 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f  F("First call to
12c40 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
12c50 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
12c60 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
12c70 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
12c80 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
12c90 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
12ca0 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
12cb0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
12cc0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
12cd0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
12ce0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
12cf0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
12d00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
12d10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
12d20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12d30 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
12d40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
12d50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
12d60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
12d70 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  .if (pSlotList =
12d80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
12d90 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
12da0 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  nt;....CACKEY_DE
12db0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
12dc0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
12dd0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
12de0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
12df0 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75  .}...count = *pu
12e00 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75  lCount;..if (cou
12e10 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  nt < slot_count)
12e20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
12e30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12e40 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20   User allocated 
12e50 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74  %lu entries, but
12e60 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74   we have %lu ent
12e70 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73  ries.", count, s
12e80 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  lot_count);....r
12e90 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
12ea0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
12eb0 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
12ec0 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
12ed0 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 72   slot_count; cur
12ee0 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 53 6c  rslot++) {...pSl
12ef0 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d  otList[currslot]
12f00 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 7d 0a   = currslot;..}.
12f10 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
12f20 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
12f30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12f40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
12f50 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
12f60 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b  lu readers.", CK
12f70 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
12f80 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
12f90 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
12fa0 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73  OK);...tokenPres
12fb0 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65  ent = tokenPrese
12fc0 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  nt; /* Supress u
12fd0 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
12fe0 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
12ff0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
13000 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
13010 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
13020 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54   slotID, CK_SLOT
13030 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
13040 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
13050 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72  F8CHAR slotDescr
13060 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
13070 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d  ey Slot";..int m
13080 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
13090 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  t bytes_to_copy;
130a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
130b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
130c0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
130d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
130e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
130f0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
13100 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
13110 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
13120 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
13130 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
13140 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
13150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13160 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
13170 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
13180 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
13190 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
131a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
131b0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
131c0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
131d0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
131e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
131f0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
13200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13210 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
13220 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
13230 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
13240 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
13250 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
13260 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
13270 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
13280 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
13290 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
132a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
132b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
132c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
132d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
132e0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
132f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
13300 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
13310 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
13320 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
13330 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
13340 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
13350 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13360 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
13370 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
13380 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
13390 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
133a0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
133b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
133c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
133d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
133e0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
133f0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
13400 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
13410 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
13420 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
13430 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
13440 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13450 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
13460 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
13470 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
13480 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
13490 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
134a0 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
134b0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
134c0 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  of(pInfo->slotDe
134d0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
134e0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mcpy(pInfo->slot
134f0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f  Description, slo
13500 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  tDescription, si
13510 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70  zeof(slotDescrip
13520 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  tion) - 1);...me
13530 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
13540 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
13550 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
13560 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
13570 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
13580 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79   = strlen(cackey
13590 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70  _slots[slotID].p
135a0 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66  csc_reader);..if
135b0 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e   (sizeof(pInfo->
135c0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
135d0 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  < bytes_to_copy)
135e0 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f   {...bytes_to_co
135f0 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66  py = sizeof(pInf
13600 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
13610 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70  D);..}..memcpy(p
13620 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
13630 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f  erID, cackey_slo
13640 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
13650 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f  reader, bytes_to
13660 5f 63 6f 70 79 29 3b 0a 0a 09 70 49 6e 66 6f 2d  _copy);...pInfo-
13670 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 0a 09 69 66  >flags = 0;...if
13680 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
13690 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
136a0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d  lots[slotID]) ==
136b0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
136c0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
136d0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
136e0 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45   CKF_TOKEN_PRESE
136f0 4e 54 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  NT;..}...pInfo->
13700 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
13710 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
13720 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
13730 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
13740 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
13750 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
13760 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
13770 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
13780 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
13790 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
137a0 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
137b0 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
137c0 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41  nor = 0x00;...CA
137d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
137e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
137f0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
13800 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
13810 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
13820 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
13830 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  V, C_GetTokenInf
13840 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
13850 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49  otID, CK_TOKEN_I
13860 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
13870 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
13880 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
13890 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
138a0 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
138b0 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64  ic CK_UTF8CHAR d
138c0 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20  efaultLabel[] = 
138d0 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b  "Unknown Token";
138e0 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
138f0 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22  CHAR model[] = "
13900 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72  CAC Token";..str
13910 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
13920 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
13930 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
13940 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
13950 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61  rts;..ssize_t la
13960 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  bel_ret;..int mu
13970 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
13980 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62   use_default_lab
13990 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  el;...CACKEY_DEB
139a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
139b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
139c0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
139d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
139e0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
139f0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
13a00 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
13a10 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
13a20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
13a30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
13a40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13a50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
13a60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
13a70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
13a80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
13a90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
13aa0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
13ab0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
13ac0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
13ad0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
13ae0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
13af0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13b00 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
13b10 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
13b20 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
13b30 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
13b40 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
13b50 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
13b60 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
13b70 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
13b80 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
13b90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
13ba0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
13bb0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
13bc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13bd0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
13be0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
13bf0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
13c00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
13c10 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
13c20 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
13c30 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
13c40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13c50 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
13c60 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
13c70 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
13c80 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
13c90 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
13ca0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
13cb0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
13cc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
13cd0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
13ce0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
13cf0 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
13d00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
13d10 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f  tID]) != CACKEY_
13d20 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
13d30 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
13d40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f  DEBUG_PRINTF("No
13d50 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e   token is presen
13d60 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c  t in slotID = %l
13d70 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  u", slotID);....
13d80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
13d90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
13da0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
13db0 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45  KR_TOKEN_NOT_PRE
13dc0 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  SENT);..}...mute
13dd0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
13de0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
13df0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
13e00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
13e10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
13e20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13e30 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
13e40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
13e50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
13e60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
13e70 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f  ./* Determine to
13e80 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63  ken label from c
13e90 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
13ea0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61  memset(pInfo->la
13eb0 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  bel, ' ', sizeof
13ec0 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
13ed0 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
13ee0 62 65 6c 20 3d 20 31 3b 0a 0a 09 70 63 73 63 5f  bel = 1;...pcsc_
13ef0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
13f00 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26  key_read_certs(&
13f10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
13f20 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  tID], NULL, &num
13f30 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63  _certs);..if (pc
13f40 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
13f50 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 6e   NULL) {...if (n
13f60 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a  um_certs > 0) {.
13f70 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63  ...label_ret = c
13f80 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
13f90 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73  ity_to_label(pcs
13fa0 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70 49  c_identities, pI
13fb0 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65  nfo->label, size
13fc0 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
13fd0 29 3b 0a 09 09 09 69 66 20 28 6c 61 62 65 6c 5f  );....if (label_
13fe0 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 75  ret > 0) {.....u
13ff0 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
14000 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a   = 0;....}...}..
14010 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
14020 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
14030 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
14040 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  1);..}...if (use
14050 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20  _default_label) 
14060 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
14070 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74  ->label, default
14080 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65  Label, sizeof(de
14090 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29  faultLabel) - 1)
140a0 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
140b0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
140c0 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
140d0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
140e0 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70  urerID));..memcp
140f0 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  y(pInfo->manufac
14100 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63  turerID, manufac
14110 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28  turerID, sizeof(
14120 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
14130 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
14140 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27  Info->model, ' '
14150 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
14160 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79  model));..memcpy
14170 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d  (pInfo->model, m
14180 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64  odel, sizeof(mod
14190 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  el) - 1);...mems
141a0 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  et(pInfo->serial
141b0 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a  Number, ' ', siz
141c0 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  eof(pInfo->seria
141d0 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d  lNumber));...mem
141e0 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69  set(pInfo->utcTi
141f0 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  me, ' ', sizeof(
14200 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29  pInfo->utcTime))
14210 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
14220 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
14230 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
14240 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
14250 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
14260 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
14270 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
14280 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
14290 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
142a0 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
142b0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
142c0 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
142d0 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
142e0 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0x00;...pInfo->
142f0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54  flags = CKF_WRIT
14300 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b  E_PROTECTED | CK
14310 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49  F_USER_PIN_INITI
14320 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b  ALIZED | CKF_TOK
14330 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c  EN_INITIALIZED |
14340 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
14350 52 45 44 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c  RED;...pInfo->ul
14360 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  MaxSessionCount 
14370 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
14380 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
14390 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
143a0 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70  ons[0])) - 1;..p
143b0 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43  Info->ulSessionC
143c0 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49  ount = CK_UNAVAI
143d0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
143e0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  N;..pInfo->ulMax
143f0 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  RwSessionCount =
14400 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77   0;..pInfo->ulRw
14410 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43  SessionCount = C
14420 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
14430 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
14440 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d  o->ulMaxPinLen =
14450 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   128;..pInfo->ul
14460 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09  MinPinLen = 0;..
14470 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75  pInfo->ulTotalPu
14480 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  blicMemory = CK_
14490 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
144a0 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
144b0 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d  >ulFreePublicMem
144c0 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
144d0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
144e0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61  ;..pInfo->ulTota
144f0 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d  lPrivateMemory =
14500 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
14510 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
14520 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61  nfo->ulFreePriva
14530 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  teMemory = CK_UN
14540 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
14550 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ATION;...CACKEY_
14560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
14570 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
14580 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
14590 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
145a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
145b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
145c0 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
145d0 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  )(CK_FLAGS flags
145e0 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52  , CK_SLOT_ID_PTR
145f0 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49   pSlotID, CK_VOI
14600 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
14610 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
14620 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
14630 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
14640 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
14650 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14660 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
14670 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
14680 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
14690 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
146a0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
146b0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
146c0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
146d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
146e0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
146f0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
14700 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
14710 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
14720 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
14730 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
14740 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
14750 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
14760 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
14770 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
14780 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
14790 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
147a0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
147b0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
147c0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
147d0 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c  anismList)(CK_SL
147e0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
147f0 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f  _MECHANISM_TYPE_
14800 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69  PTR pMechanismLi
14810 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
14820 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41   pulCount) {..CA
14830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14840 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
14850 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
14860 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
14870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14880 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
14890 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
148a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
148b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
148c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
148d0 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
148e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
148f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
14900 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  .  pulCount is N
14910 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
14920 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
14930 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
14940 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d  MechanismList ==
14950 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
14960 6f 75 6e 74 20 3d 20 33 3b 0a 0a 09 09 43 41 43  ount = 3;....CAC
14970 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14980 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
14990 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
149a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
149b0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a  _OK);..}...if (*
149c0 70 75 6c 43 6f 75 6e 74 20 3c 20 33 29 20 7b 0a  pulCount < 3) {.
149d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
149e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42  RINTF("Error.  B
149f0 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e  uffer too small.
14a00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
14a10 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
14a20 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61  LL);..}...pMecha
14a30 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b  nismList[0] = CK
14a40 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 70 4d 65  M_RSA_PKCS;..pMe
14a50 63 68 61 6e 69 73 6d 4c 69 73 74 5b 31 5d 20 3d  chanismList[1] =
14a60 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b   CKM_SHA1_RSA_PK
14a70 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  CS;..*pulCount =
14a80 20 32 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   2;...CACKEY_DEB
14a90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
14aa0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
14ab0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
14ac0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
14ad0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
14ae0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
14af0 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43  MechanismInfo)(C
14b00 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
14b10 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  , CK_MECHANISM_T
14b20 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43  YPE type, CK_MEC
14b30 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20  HANISM_INFO_PTR 
14b40 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75  pInfo) {..int mu
14b50 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
14b60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14b70 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
14b80 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
14b90 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
14ba0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
14bb0 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
14bc0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
14bd0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
14be0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
14bf0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
14c00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14c10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14c20 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
14c30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
14c40 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
14c50 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
14c60 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
14c70 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
14c80 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
14c90 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
14ca0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
14cb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14cc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
14cd0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
14ce0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
14cf0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
14d00 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
14d10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
14d20 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
14d30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
14d40 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
14d50 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
14d60 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
14d70 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
14d80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14d90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14da0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
14db0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
14dc0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
14dd0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
14de0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
14df0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
14e00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14e10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
14e20 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
14e30 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
14e40 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
14e50 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
14e60 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
14e70 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
14e80 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
14e90 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
14ea0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
14eb0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
14ec0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
14ed0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
14ee0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
14ef0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
14f00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14f10 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
14f20 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
14f30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
14f40 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
14f50 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 68 69 73 20  .../* XXX: This 
14f60 69 73 20 75 6e 74 65 73 74 65 64 2c 20 61 6e 64  is untested, and
14f70 20 66 75 72 74 68 65 72 20 49 27 6d 20 6e 6f 74   further I'm not
14f80 20 72 65 61 6c 6c 79 20 73 75 72 65 20 69 66 20   really sure if 
14f90 74 68 69 73 20 69 73 20 63 6f 72 72 65 63 74 2e  this is correct.
14fa0 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 74 79 70   */..switch (typ
14fb0 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  e) {...case CKM_
14fc0 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e  RSA_PKCS:....pIn
14fd0 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
14fe0 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
14ff0 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
15000 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
15010 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
15020 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
15030 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
15040 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
15050 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
15060 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 58 5f  .case CKM_RSA_X_
15070 35 30 39 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  509:....pInfo->u
15080 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31  lMinKeySize = 51
15090 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  2;....pInfo->ulM
150a0 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32  axKeySize = 8192
150b0 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  ;....pInfo->flag
150c0 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46  s = CKF_HW | CKF
150d0 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44  _ENCRYPT | CKF_D
150e0 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47  ECRYPT | CKF_SIG
150f0 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a  N | CKF_VERIFY;.
15100 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
15110 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b   CKM_SHA1_RSA_PK
15120 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  CS:....pInfo->ul
15130 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32  MinKeySize = 512
15140 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ;....pInfo->ulMa
15150 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b  xKeySize = 8192;
15160 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ....pInfo->flags
15170 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f   = CKF_HW | CKF_
15180 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46  SIGN | CKF_VERIF
15190 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  Y;....break;..}.
151a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
151b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
151c0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
151d0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
151e0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20  (CKR_OK);.}../* 
151f0 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74  We don't support
15200 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f   this method. */
15210 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
15220 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
15230 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f  tToken)(CK_SLOT_
15240 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54  ID slotID, CK_UT
15250 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
15260 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
15270 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  en, CK_UTF8CHAR_
15280 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43  PTR pLabel) {..C
15290 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
152a0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
152b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
152c0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
152d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
152e0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
152f0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
15300 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
15310 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
15320 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
15330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15340 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
15350 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
15360 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ECTED (%i)", CKR
15370 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
15380 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  TECTED);...retur
15390 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  n(CKR_TOKEN_WRIT
153a0 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a  E_PROTECTED);.}.
153b0 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70  ./* We don't sup
153c0 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64  port this method
153d0 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  . */.CK_DEFINE_F
153e0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
153f0 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53  _InitPIN)(CK_SES
15400 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
15410 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  sion, CK_UTF8CHA
15420 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
15430 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b  LONG ulPinLen) {
15440 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15450 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
15460 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
15470 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
15480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15490 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
154a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
154b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
154c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
154d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
154e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
154f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
15500 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
15510 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20  ROTECTED (%i)", 
15520 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
15530 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65  PROTECTED);...re
15540 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57  turn(CKR_TOKEN_W
15550 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
15560 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
15570 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
15580 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
15590 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
155a0 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53  , C_SetPIN)(CK_S
155b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
155c0 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43  ession, CK_UTF8C
155d0 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c  HAR_PTR pOldPin,
155e0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50   CK_ULONG ulOldP
155f0 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48  inLen, CK_UTF8CH
15600 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20  AR_PTR pNewPin, 
15610 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69  CK_ULONG ulNewPi
15620 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nLen) {..CACKEY_
15630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
15640 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
15650 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
15660 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
15670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
15680 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
15690 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
156a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
156b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
156c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
156d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
156e0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
156f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
15700 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
15710 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
15720 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
15730 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
15740 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
15750 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
15760 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65  (CK_RV, C_OpenSe
15770 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49  ssion)(CK_SLOT_I
15780 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41  D slotID, CK_FLA
15790 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49  GS flags, CK_VOI
157a0 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69  D_PTR pApplicati
157b0 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f  on, CK_NOTIFY no
157c0 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e  tify, CK_SESSION
157d0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65  _HANDLE_PTR phSe
157e0 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e  ssion) {..unsign
157f0 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e  ed long idx;..in
15800 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
15810 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69  .int found_sessi
15820 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59  on = 0;...CACKEY
15830 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
15840 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
15850 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52  (flags & CKF_SER
15860 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20  IAL_SESSION) != 
15870 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49  CKF_SERIAL_SESSI
15880 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43  ON) {...return(C
15890 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c  KR_SESSION_PARAL
158a0 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  LEL_NOT_SUPPORTE
158b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
158c0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
158d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
158e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
158f0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
15900 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
15910 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
15920 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
15930 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
15940 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
15950 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
15960 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
15970 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
15980 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
15990 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
159a0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
159b0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
159c0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
159d0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
159e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
159f0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
15a00 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
15a10 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
15a20 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
15a30 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
15a40 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
15a50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15a60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15a70 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
15a80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
15a90 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
15aa0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
15ab0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
15ac0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
15ad0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15ae0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
15af0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
15b00 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
15b10 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
15b20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
15b30 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
15b40 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
15b50 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
15b60 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
15b70 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f  INVALID);..}.../
15b80 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
15b90 65 20 63 61 72 64 20 69 73 20 61 63 74 75 61 6c  e card is actual
15ba0 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20  ly in the slot. 
15bb0 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65 63  */../* XXX: Chec
15bc0 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
15bd0 68 69 73 20 69 73 20 69 6e 20 74 68 65 20 50 4b  his is in the PK
15be0 43 53 23 31 31 20 73 70 65 63 69 66 69 63 61 74  CS#11 specificat
15bf0 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b  ion */..if (cack
15c00 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
15c10 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
15c20 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45  lotID]) != CACKE
15c30 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
15c40 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45  ESENT) {...CACKE
15c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15c60 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74  Error.  Card not
15c70 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72   present.  Retur
15c80 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f  ning CKR_DEVICE_
15c90 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61  REMOVED");....ca
15ca0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
15cb0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
15cc0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15cd0 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 29  _DEVICE_REMOVED)
15ce0 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
15cf0 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 1; idx < (size
15d00 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
15d10 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
15d20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
15d30 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
15d40 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
15d50 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20  ns[idx].active) 
15d60 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73 69  {....found_sessi
15d70 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53  on = 1;.....*phS
15d80 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09  ession = idx;...
15d90 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
15da0 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
15db0 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  1;....cackey_ses
15dc0 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49  sions[idx].slotI
15dd0 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63  D = slotID;....c
15de0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
15df0 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  dx].state = CKS_
15e00 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f  RO_PUBLIC_SESSIO
15e10 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  N;....cackey_ses
15e20 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73  sions[idx].flags
15e30 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61 63   = flags;....cac
15e40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
15e50 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20  ].ulDeviceError 
15e60 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  = 0;....cackey_s
15e70 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70  essions[idx].pAp
15e80 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70 70  plication = pApp
15e90 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63  lication;....cac
15ea0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
15eb0 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66  ].Notify = notif
15ec0 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  y;.....cackey_se
15ed0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
15ee0 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09  tities = NULL;..
15ef0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
15f00 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65  s[idx].identitie
15f10 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  s_count = 0;....
15f20 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
15f30 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63 74  [idx].search_act
15f40 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  ive = 0;.....cac
15f50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
15f60 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
15f70 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  0;.....cackey_se
15f80 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72  ssions[idx].decr
15f90 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ypt_active = 0;.
15fa0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
15fb0 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
15fc0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
15fd0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61  d_identities(&ca
15fe0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
15ff0 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73  D], &cackey_sess
16000 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
16010 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09  ties_count);....
16020 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a  ..break;...}..}.
16030 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
16040 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
16050 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
16060 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
16070 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
16080 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16090 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
160a0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
160b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
160c0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
160d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e  ;..}...if (!foun
160e0 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43  d_session) {...C
160f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16100 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
16110 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20  R_SESSION_COUNT 
16120 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49  (%i)", CKR_SESSI
16130 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65  ON_COUNT);....re
16140 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
16150 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41  _COUNT);..}...CA
16160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16170 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
16180 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
16190 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
161a0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
161b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
161c0 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  V, C_CloseSessio
161d0 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
161e0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
161f0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
16200 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
16210 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
16220 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
16230 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
16240 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16250 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16260 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
16270 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
16280 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
16290 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
162a0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
162b0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
162c0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
162d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
162e0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
162f0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
16300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16310 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
16320 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
16330 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
16340 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
16350 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
16360 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
16370 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
16380 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
16390 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
163a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
163b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
163c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
163d0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
163e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
163f0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
16400 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
16410 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
16420 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
16430 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
16440 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
16450 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
16460 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16470 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
16480 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
16490 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
164a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
164b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  LID);..}...cacke
164c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
164d0 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b  ion].active = 0;
164e0 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64  ..cackey_free_id
164f0 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f  entities(cackey_
16500 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
16510 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63  n].identities, c
16520 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
16530 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
16540 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75  ies_count);...mu
16550 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
16560 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
16570 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
16580 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
16590 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
165a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
165b0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
165c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
165d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
165e0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
165f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16600 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
16610 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
16620 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
16630 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
16640 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
16650 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41  (CK_RV, C_CloseA
16660 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53  llSessions)(CK_S
16670 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b  LOT_ID slotID) {
16680 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a  ..uint32_t idx;.
16690 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
166a0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
166b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
166c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
166d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
166e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
166f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16700 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
16710 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
16720 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
16730 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
16740 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
16750 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
16760 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
16770 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
16780 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
16790 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
167a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
167b0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
167c0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
167d0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
167e0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
167f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
16800 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
16810 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
16820 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
16830 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
16840 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
16850 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
16860 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16870 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16880 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
16890 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
168a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
168b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
168c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
168d0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
168e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
168f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
16900 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
16910 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
16920 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
16930 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
16940 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
16950 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
16960 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
16970 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
16980 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  VALID);..}...for
16990 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
169a0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
169b0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
169c0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
169d0 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
169e0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
169f0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
16a00 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61  ive) {....if (ca
16a10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
16a20 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f  x].slotID != slo
16a30 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69  tID) {.....conti
16a40 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  nue;....}.....ca
16a50 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
16a60 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
16a70 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73  );....C_CloseSes
16a80 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61  sion(idx);....ca
16a90 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
16aa0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
16ab0 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
16ac0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
16ad0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
16ae0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
16af0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
16b00 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
16b10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
16b20 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
16b30 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
16b40 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
16b50 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
16b60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16b70 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
16b80 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
16b90 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
16ba0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
16bb0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
16bc0 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e  RV, C_GetSession
16bd0 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Info)(CK_SESSION
16be0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
16bf0 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46  , CK_SESSION_INF
16c00 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
16c10 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
16c20 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
16c30 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
16c40 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
16c50 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
16c60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16c70 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
16c80 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
16c90 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
16ca0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
16cb0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
16cc0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
16cd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16ce0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
16cf0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
16d00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
16d10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
16d20 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
16d30 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
16d40 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
16d50 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
16d60 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
16d70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
16d80 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
16d90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16da0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
16db0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
16dc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
16dd0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
16de0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
16df0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
16e00 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
16e10 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
16e20 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
16e30 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
16e40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16e50 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
16e60 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
16e70 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
16e80 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
16e90 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
16ea0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
16eb0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
16ec0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
16ed0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
16ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16ef0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
16f00 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
16f10 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
16f20 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
16f30 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
16f40 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d  .pInfo->slotID =
16f50 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
16f60 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
16f70 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65  D;..pInfo->state
16f80 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
16f90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61  ns[hSession].sta
16fa0 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  te;..pInfo->flag
16fb0 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  s = cackey_sessi
16fc0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c  ons[hSession].fl
16fd0 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44  ags;..pInfo->ulD
16fe0 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63  eviceError = cac
16ff0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
17000 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45  ssion].ulDeviceE
17010 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  rror;...mutex_re
17020 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
17030 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
17040 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
17050 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
17060 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
17070 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17080 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
17090 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
170a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
170b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
170c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
170d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
170e0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
170f0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
17100 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
17110 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
17120 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e  , C_GetOperation
17130 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  State)(CK_SESSIO
17140 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
17150 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
17160 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20  OperationState, 
17170 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
17180 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65  OperationStateLe
17190 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
171a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
171b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
171c0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
171d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
171e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
171f0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
17200 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
17210 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
17220 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
17230 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
17240 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
17250 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
17260 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
17270 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
17280 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
17290 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
172a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
172b0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
172c0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
172d0 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74  _RV, C_SetOperat
172e0 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53  ionState)(CK_SES
172f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
17300 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
17310 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  R pOperationStat
17320 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70  e, CK_ULONG ulOp
17330 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c  erationStateLen,
17340 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
17350 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79  E hEncryptionKey
17360 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
17370 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61 74 69  LE hAuthenticati
17380 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  onKey) {..CACKEY
17390 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
173a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
173b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
173c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
173d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
173e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
173f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
17400 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
17410 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
17420 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
17430 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
17440 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
17450 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
17460 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
17470 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
17480 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
17490 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
174a0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
174b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
174c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e  N(CK_RV, C_Login
174d0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
174e0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
174f0 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54  _USER_TYPE userT
17500 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ype, CK_UTF8CHAR
17510 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
17520 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a  ONG ulPinLen) {.
17530 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
17540 6c 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65  l;..int login_re
17550 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
17560 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
17570 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
17580 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
17590 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
175a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
175b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
175c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
175d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
175e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
175f0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
17600 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
17610 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
17620 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
17630 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
17640 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
17650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17660 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
17670 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
17680 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
17690 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
176a0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
176b0 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70 65  }...if (userType
176c0 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a   != CKU_USER) {.
176d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
176e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57  RINTF("Error.  W
176f0 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55  e only support U
17700 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20  SER mode, asked 
17710 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20  for %lu mode.", 
17720 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17730 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74  userType)....ret
17740 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50  urn(CKR_USER_TYP
17750 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
17760 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
17770 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
17780 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
17790 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
177a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
177b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
177c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
177d0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
177e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
177f0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
17800 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
17810 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
17820 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
17830 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
17840 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
17850 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
17860 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
17870 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
17880 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
17890 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
178a0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
178b0 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74  ;..}...login_ret
178c0 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28   = cackey_login(
178d0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61  &cackey_slots[ca
178e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
178f0 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c  ession].slotID],
17900 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c   pPin, ulPinLen,
17910 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6c 6f 67   NULL);..if (log
17920 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
17930 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
17940 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
17950 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
17960 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69  ck);....if (logi
17970 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  n_ret == CACKEY_
17980 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b  PCSC_E_LOCKED) {
17990 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
179a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
179b0 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64   Token is locked
179c0 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
179d0 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
179e0 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f  ...} else if (lo
179f0 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
17a00 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
17a10 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
17a20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17a30 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22  .  Invalid PIN."
17a40 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
17a50 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
17a60 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
17a70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17a80 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72  ror.  Unknown er
17a90 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f  ror returned fro
17aa0 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29  m cackey_login()
17ab0 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65   (%i)", login_re
17ac0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
17ad0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
17ae0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
17af0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
17b00 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
17b10 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a  USER_FUNCTIONS;.
17b20 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
17b30 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
17b40 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
17b50 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
17b60 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
17b70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17b80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
17b90 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
17ba0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
17bb0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
17bc0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
17bd0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
17be0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
17bf0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
17c00 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
17c10 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
17c20 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
17c30 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gout)(CK_SESSION
17c40 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
17c50 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
17c60 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
17c70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
17c80 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
17c90 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
17ca0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
17cb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17cc0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
17cd0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
17ce0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
17cf0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
17d00 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
17d10 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
17d20 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
17d30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
17d40 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
17d50 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
17d60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17d70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17d80 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
17d90 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
17da0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
17db0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
17dc0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
17dd0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
17de0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
17df0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
17e00 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
17e10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17e20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17e30 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
17e40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
17e50 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
17e60 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
17e70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
17e80 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
17e90 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
17ea0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
17eb0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
17ec0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17ed0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
17ee0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
17ef0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
17f00 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
17f10 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
17f20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
17f30 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20  ession].state = 
17f40 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
17f50 53 53 49 4f 4e 3b 0a 0a 09 6d 75 74 65 78 5f 72  SSION;...mutex_r
17f60 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
17f70 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
17f80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
17f90 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
17fa0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
17fb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17fc0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
17fd0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
17fe0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
17ff0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
18000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18010 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
18020 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
18030 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
18040 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
18050 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
18060 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  V, C_CreateObjec
18070 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
18080 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
18090 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
180a0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
180b0 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
180c0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
180d0 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43  R phObject) {..C
180e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
180f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
18100 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
18110 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
18120 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18130 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
18140 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
18150 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
18160 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
18170 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
18180 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18190 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
181a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
181b0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
181c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
181d0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
181e0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
181f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
18200 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
18210 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
18220 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53  CopyObject)(CK_S
18230 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
18240 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
18250 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
18260 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
18270 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
18280 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
18290 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
182a0 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74  _PTR phNewObject
182b0 29 20 7b 0a 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 43 61 6c 6c 65 64  G_PRINTF("Called
182d0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
182e0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
182f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18300 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18310 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
18320 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
18330 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
18340 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
18350 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18360 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
18370 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
18380 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
18390 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
183a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
183b0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
183c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
183d0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
183e0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
183f0 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a  RV, C_DestroyObj
18400 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
18410 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
18420 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
18430 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41  E hObject) {..CA
18440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18450 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
18460 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
18470 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
18480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18490 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
184a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
184b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
184c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
184d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
184e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
184f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
18500 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
18510 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
18520 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
18530 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
18540 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
18550 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
18560 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
18570 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
18580 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b  etObjectSize)(CK
18590 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
185a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
185b0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
185c0 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ct, CK_ULONG_PTR
185d0 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43   pulSize) {..CAC
185e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
185f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
18600 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
18610 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
18620 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18630 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
18640 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
18650 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
18660 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
18670 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
18680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18690 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
186a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
186b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
186c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
186d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
186e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
186f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
18700 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
18710 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
18720 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29  tAttributeValue)
18730 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
18740 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
18750 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
18760 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
18770 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
18780 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
18790 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49  unt) {..CK_ATTRI
187a0 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
187b0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
187c0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
187d0 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ty;..unsigned lo
187e0 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c  ng identity_idx,
187f0 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f   attr_idx, sess_
18800 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64  attr_idx, num_id
18810 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  s;..int mutex_re
18820 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74  tval;..CK_RV ret
18830 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43  val = CKR_OK;..C
18840 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75  K_VOID_PTR pValu
18850 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56  e;..CK_ULONG ulV
18860 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45  alueLen;...CACKE
18870 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18880 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
18890 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
188a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
188b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
188c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
188d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
188e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
188f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
18900 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
18910 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
18920 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
18930 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
18940 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
18950 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
18960 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
18970 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18980 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
18990 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
189a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
189b0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
189c0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f  ID);..}...if (hO
189d0 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09  bject == 0) {...
189e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
189f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a  NTF("Error.  Obj
18a00 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ect handle out o
18a10 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
18a20 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45  .return(CKR_OBJE
18a30 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  CT_HANDLE_INVALI
18a40 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43  D);..}...if (ulC
18a50 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  ount == 0) {.../
18a60 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c  * Short circuit,
18a70 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73   if zero objects
18a80 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20   were specified 
18a90 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d  return zero item
18aa0 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f  s immediately */
18ab0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18ac0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
18ad0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
18ae0 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
18af0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
18b00 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
18b10 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d  .if (pTemplate =
18b20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
18b30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18b40 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61  "Error.  pTempla
18b50 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  te is NULL.");..
18b60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
18b70 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
18b80 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d  ..identity_idx =
18b90 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09   hObject - 1;...
18ba0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
18bb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
18bc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
18bd0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
18be0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
18bf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18c00 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
18c10 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
18c20 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
18c30 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
18c40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
18c50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
18c60 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
18c70 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
18c80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
18c90 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18ca0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18cb0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
18cc0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
18cd0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
18ce0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
18cf0 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20  ..}...num_ids = 
18d00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18d10 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
18d20 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66  ties_count;...if
18d30 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e   (identity_idx >
18d40 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63  = num_ids) {...c
18d50 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
18d60 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
18d70 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
18d80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18d90 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c  r.  Object handl
18da0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  e out of range. 
18db0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20   identity_idx = 
18dc0 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25  %lu, num_ids = %
18dd0 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu.", (unsigned 
18de0 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69  long) identity_i
18df0 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  dx, (unsigned lo
18e00 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09  ng) num_ids);...
18e10 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45  .return(CKR_OBJE
18e20 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  CT_HANDLE_INVALI
18e30 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74  D);..}...identit
18e40 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  y = &cackey_sess
18e50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
18e60 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69  dentities[identi
18e70 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28  ty_idx];...for (
18e80 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74  attr_idx = 0; at
18e90 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74  tr_idx < ulCount
18ea0 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  ; attr_idx++) {.
18eb0 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70  ..curr_attr = &p
18ec0 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64  Template[attr_id
18ed0 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20  x];....pValue = 
18ee0 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
18ef0 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
18f00 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
18f10 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69  UG_PRINTF("Looki
18f20 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65  ng for attribute
18f30 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69   0x%08lx (identi
18f40 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75  ty:%lu) ...", (u
18f50 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18f60 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28  rr_attr->type, (
18f70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
18f80 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09  dentity_idx);...
18f90 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f  .for (sess_attr_
18fa0 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74  idx = 0; sess_at
18fb0 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  tr_idx < identit
18fc0 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  y->attributes_co
18fd0 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  unt; sess_attr_i
18fe0 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69  dx++) {....if (i
18ff0 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
19000 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
19010 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f  x].type == curr_
19020 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09  attr->type) {...
19030 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19040 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e  RINTF(" ... foun
19050 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25  d it, pValue = %
19060 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  p, ulValueLen = 
19070 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e  %lu", identity->
19080 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
19090 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
190a0 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  , identity->attr
190b0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
190c0 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
190d0 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c  );..........pVal
190e0 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61  ue = identity->a
190f0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
19100 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b  ttr_idx].pValue;
19110 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
19120 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  = identity->attr
19130 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
19140 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
19150 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
19160 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61   (curr_attr->pVa
19170 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b  lue && pValue) {
19180 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
19190 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d  r->ulValueLen >=
191a0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09   ulValueLen) {..
191b0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
191c0 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61  ttr->pValue, pVa
191d0 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29  lue, ulValueLen)
191e0 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
191f0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
19200 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
19210 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
19220 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
19230 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72  ....}...}....cur
19240 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
19250 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  en = ulValueLen;
19260 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
19270 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
19280 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
19290 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
192a0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
192b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
192c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
192d0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
192e0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
192f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
19300 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72  ROR);..}...if (r
19310 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54  etval == CKR_ATT
19320 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41  RIBUTE_TYPE_INVA
19330 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  LID) {...CACKEY_
19340 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19350 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52  turning CKR_ATTR
19360 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
19370 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  ID (%i)", (int) 
19380 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
19390 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43   if (retval == C
193a0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
193b0 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ALL) {...CACKEY_
193c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
193d0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46  turning CKR_BUFF
193e0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69  ER_TOO_SMALL (%i
193f0 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
19400 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72  );..} else if (r
19410 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29  etval == CKR_OK)
19420 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
19430 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
19440 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
19450 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
19460 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
19470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19480 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
19490 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
194a0 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
194b0 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
194c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
194d0 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  , C_SetAttribute
194e0 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f  Value)(CK_SESSIO
194f0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
19500 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
19510 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
19520 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
19530 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
19540 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41  G ulCount) {..CA
19550 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19560 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
19570 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
19580 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
19590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
195a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
195b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
195c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
195d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
195e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
195f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19600 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
19610 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
19620 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
19630 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
19640 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
19650 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
19660 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
19670 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
19680 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
19690 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28  indObjectsInit)(
196a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
196b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41  E hSession, CK_A
196c0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
196d0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
196e0 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74   ulCount) {..int
196f0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
19700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19710 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
19720 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
19730 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
19740 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19750 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
19760 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
19770 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
19780 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
19790 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
197a0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
197b0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
197c0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
197d0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
197e0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
197f0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
19800 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19810 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
19820 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
19830 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
19840 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
19850 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
19860 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
19870 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
19880 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
19890 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
198a0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
198b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
198c0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
198d0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
198e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
198f0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
19900 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
19910 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
19920 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
19930 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
19940 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19950 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19960 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19970 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
19980 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
19990 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
199a0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
199b0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
199c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
199d0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
199e0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
199f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
19a00 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
19a10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19a20 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
19a30 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  ch already activ
19a40 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
19a50 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
19a60 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
19a70 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
19a80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19a90 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d  Session].slotID]
19aa0 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  .slot_reset) {..
19ab0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19ac0 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20 68  INTF("The slot h
19ad0 61 73 20 62 65 65 6e 20 72 65 73 65 74 20 73 69  as been reset si
19ae0 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b  nce we last look
19af0 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69 65  ed for identitie
19b00 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22  s -- rescanning"
19b10 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  );....if (cackey
19b20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19b30 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 21  on].identities !
19b40 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63  = NULL) {....cac
19b50 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
19b60 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ies(cackey_sessi
19b70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
19b80 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79  entities, cackey
19b90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19ba0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
19bb0 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ount);.....cacke
19bc0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19bd0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
19be0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65  = NULL;....cacke
19bf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19c00 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
19c10 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a  count = 0;...}..
19c20 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
19c30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19c40 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d  Session].slotID]
19c50 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b  .slot_reset = 0;
19c60 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
19c70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19c80 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
19c90 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
19ca0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
19cb0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
19cc0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69   = cackey_read_i
19cd0 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65  dentities(&cacke
19ce0 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73  y_slots[cackey_s
19cf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
19d00 5d 2e 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b  ].slotID], &cack
19d10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
19d20 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
19d30 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66  _count);..}...if
19d40 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e   (pTemplate != N
19d50 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43  ULL) {...if (ulC
19d60 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
19d70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19d80 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
19d90 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75  _query_count = u
19da0 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65  lCount;....cacke
19db0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19dc0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
19dd0 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75  y = malloc(ulCou
19de0 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
19df0 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65  mplate));.....me
19e00 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73  mcpy(cackey_sess
19e10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
19e20 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65  earch_query, pTe
19e30 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20  mplate, ulCount 
19e40 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c  * sizeof(*pTempl
19e50 61 74 65 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20  ate));...} else 
19e60 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  {....cackey_sess
19e70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
19e80 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
19e90 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79  t = 0;....cackey
19ea0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19eb0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
19ec0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20   = NULL;...}..} 
19ed0 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43  else {...if (ulC
19ee0 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
19ef0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
19f00 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
19f10 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ck);.....CACKEY_
19f20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
19f30 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75 65  ror.  Search que
19f40 72 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ry specified as 
19f50 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72  NULL, but number
19f60 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73 20   of query terms 
19f70 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73  not specified as
19f80 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72   0.");.....retur
19f90 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
19fa0 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  BAD);...}....cac
19fb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19fc0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
19fd0 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  ery_count = 0;..
19fe0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
19ff0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1a000 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a  h_query = NULL;.
1a010 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
1a020 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1a030 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31  earch_active = 1
1a040 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
1a050 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1a060 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b  rch_curr_id = 0;
1a070 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1a080 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1a090 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1a0a0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1a0b0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1a0c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a0d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a0e0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1a0f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1a100 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1a110 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1a120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1a130 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1a140 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1a150 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1a160 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1a170 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
1a180 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53  indObjects)(CK_S
1a190 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1a1a0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
1a1b0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f  T_HANDLE_PTR phO
1a1c0 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  bject, CK_ULONG 
1a1d0 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
1a1e0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1a1f0 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b  ulObjectCount) {
1a200 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
1a210 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
1a220 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  d;..CK_ATTRIBUTE
1a230 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b   *curr_attr;..CK
1a240 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69  _ULONG curr_id_i
1a250 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f  dx, curr_out_id_
1a260 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69  idx, curr_attr_i
1a270 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64  dx, sess_attr_id
1a280 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74  x;..CK_ULONG mat
1a290 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76  ched_count, prev
1a2a0 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a  _matched_count;.
1a2b0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1a2c0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1a2d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1a2e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1a2f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1a300 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a310 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a320 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1a330 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1a340 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1a350 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1a360 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74  ...if (pulObject
1a370 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
1a380 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a390 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a3a0 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69  pulObjectCount i
1a3b0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1a3c0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1a3d0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1a3e0 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
1a3f0 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63  LL && ulMaxObjec
1a400 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  tCount == 0) {..
1a410 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
1a420 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63  t, if zero objec
1a430 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ts were specifie
1a440 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74  d return zero it
1a450 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ems immediately 
1a460 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43  */...*pulObjectC
1a470 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43  ount = 0;....CAC
1a480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a490 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1a4a0 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
1a4b0 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
1a4c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a4d0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
1a4e0 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29  hObject == NULL)
1a4f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a500 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a510 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55    phObject is NU
1a520 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1a530 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1a540 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
1a550 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  MaxObjectCount =
1a560 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1a570 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1a580 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75  ror.  Maximum nu
1a590 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
1a5a0 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72  specified as zer
1a5b0 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  o.");....return(
1a5c0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1a5d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1a5e0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1a5f0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1a600 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1a610 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1a620 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1a630 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a640 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a650 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1a660 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1a670 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1a680 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1a690 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1a6a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1a6b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1a6c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1a6d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1a6e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1a6f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a700 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1a710 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1a720 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1a730 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1a740 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1a750 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1a760 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1a770 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1a780 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1a790 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a7a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1a7b0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1a7c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1a7d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1a7e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1a7f0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1a800 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1a810 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
1a820 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1a830 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1a840 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1a850 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a860 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f  rror.  Search no
1a870 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
1a880 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
1a890 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
1a8a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 75  ALIZED);..}...cu
1a8b0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20  rr_out_id_idx = 
1a8c0 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64  0;..for (curr_id
1a8d0 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65  _idx = cackey_se
1a8e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1a8f0 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b  .search_curr_id;
1a900 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63   curr_id_idx < c
1a910 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a920 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1a930 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d  ies_count && ulM
1a940 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63  axObjectCount; c
1a950 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a  urr_id_idx++) {.
1a960 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63  ..curr_id = &cac
1a970 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1a980 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1a990 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a  s[curr_id_idx];.
1a9a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a9b0 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69  PRINTF("Processi
1a9c0 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22  ng identity:%lu"
1a9d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1a9e0 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a  ) curr_id_idx);.
1a9f0 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ...matched_count
1aa00 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75   = 0;....for (cu
1aa10 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  rr_attr_idx = 0;
1aa20 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c   curr_attr_idx <
1aa30 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1aa40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1aa50 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63  h_query_count; c
1aa60 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20  urr_attr_idx++) 
1aa70 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65  {....prev_matche
1aa80 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65  d_count = matche
1aa90 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72  d_count;.....cur
1aaa0 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79  r_attr = &cackey
1aab0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1aac0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1aad0 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b  [curr_attr_idx];
1aae0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1aaf0 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65 63  G_PRINTF("  Chec
1ab00 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75  king for attribu
1ab10 74 65 20 30 78 25 30 38 6c 78 20 69 6e 20 69 64  te 0x%08lx in id
1ab20 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 28  entity:%i...", (
1ab30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1ab40 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20  urr_attr->type, 
1ab50 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
1ab60 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  x);....CACKEY_DE
1ab70 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
1ab80 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20    Value looking 
1ab90 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72  for:", curr_attr
1aba0 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61  ->pValue, curr_a
1abb0 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29  ttr->ulValueLen)
1abc0 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f  ;.....for (sess_
1abd0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65  attr_idx = 0; se
1abe0 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75  ss_attr_idx < cu
1abf0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
1ac00 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74  s_count; sess_at
1ac10 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  tr_idx++) {.....
1ac20 69 66 20 28 63 75 72 72 5f 69 64 2d 3e 61 74 74  if (curr_id->att
1ac30 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
1ac40 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63  r_idx].type == c
1ac50 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20  urr_attr->type) 
1ac60 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
1ac70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
1ac80 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69  ... found matchi
1ac90 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 09  ng type ...");..
1aca0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1acb0 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e  _PRINTBUF("    .
1acc0 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20  .. our value:", 
1acd0 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
1ace0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
1acf0 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  x].pValue, curr_
1ad00 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
1ad10 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
1ad20 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1ad30 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e  .if (curr_attr->
1ad40 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20  pValue == NULL) 
1ad50 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  {.......CACKEY_D
1ad60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
1ad70 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69      ... found wi
1ad80 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a  ldcard match");.
1ad90 0a 09 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63  .......matched_c
1ada0 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62  ount++;........b
1adb0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 20 09  reak;......}.. .
1adc0 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
1add0 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  r->ulValueLen ==
1ade0 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
1adf0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
1ae00 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 26  dx].ulValueLen &
1ae10 26 20 6d 65 6d 63 6d 70 28 63 75 72 72 5f 61 74  & memcmp(curr_at
1ae20 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72  tr->pValue, curr
1ae30 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
1ae40 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70  sess_attr_idx].p
1ae50 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e  Value, curr_id->
1ae60 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
1ae70 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75  attr_idx].ulValu
1ae80 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09  eLen) == 0) {...
1ae90 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1aea0 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20  _PRINTF("       
1aeb0 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20  ... found exact 
1aec0 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 09 09  match");........
1aed0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b  matched_count++;
1aee0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
1aef0 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d  ....}.....}....}
1af00 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65 20 61  ...../* If the a
1af10 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64 20 6e  ttribute could n
1af20 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c 20 64  ot be matched, d
1af30 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 74  o not try to mat
1af40 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74  ch additional at
1af50 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09 09 69  tributes */....i
1af60 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  f (prev_matched_
1af70 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64  count == matched
1af80 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72  _count) {.....br
1af90 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  eak;....}...}...
1afa0 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63 6f 75  .if (matched_cou
1afb0 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73  nt == cackey_ses
1afc0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1afd0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
1afe0 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  nt) {....CACKEY_
1aff0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
1b000 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74 72 69  ... All %i attri
1b010 62 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f  butes checked fo
1b020 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20  r found, adding 
1b030 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f 20 72  identity:%i to r
1b040 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c 20 28  eturned list", (
1b050 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73  int) cackey_sess
1b060 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1b070 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
1b080 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  t, (int) curr_id
1b090 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a  _idx);.....phObj
1b0a0 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f  ect[curr_out_id_
1b0b0 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69  idx] = curr_id_i
1b0c0 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61  dx + 1;.....ulMa
1b0d0 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a  xObjectCount--;.
1b0e0 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f  ....curr_out_id_
1b0f0 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20  idx++;...} else 
1b100 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
1b110 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
1b120 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79  Not all %i (only
1b130 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74 72 69   found %i) attri
1b140 62 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f  butes checked fo
1b150 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64  r found, not add
1b160 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 22  ing identity:%i"
1b170 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73  , (int) cackey_s
1b180 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b190 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
1b1a0 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74 63  ount, (int) matc
1b1b0 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  hed_count, (int)
1b1c0 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09   curr_id_idx);..
1b1d0 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65  .}..}..cackey_se
1b1e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1b1f0 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20  .search_curr_id 
1b200 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09  = curr_id_idx;..
1b210 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  *pulObjectCount 
1b220 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  = curr_out_id_id
1b230 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  x;...mutex_retva
1b240 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1b250 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1b260 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1b270 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1b280 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b290 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b2a0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1b2b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1b2c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1b2d0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
1b2e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1b2f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1b300 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74  (%i), num object
1b310 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b  s = %lu", CKR_OK
1b320 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  , *pulObjectCoun
1b330 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  t);...return(CKR
1b340 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1b350 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1b360 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  V, C_FindObjects
1b370 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
1b380 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1b390 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
1b3a0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1b3b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1b3c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1b3d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1b3e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1b3f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b400 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1b410 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1b420 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1b430 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1b440 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1b450 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1b460 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1b470 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1b480 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1b490 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1b4a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b4b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b4c0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1b4d0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1b4e0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1b4f0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1b500 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1b510 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1b520 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1b530 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1b540 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1b550 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1b560 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b570 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1b580 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1b590 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1b5a0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
1b5b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1b5c0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
1b5d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1b5e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1b5f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1b600 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b610 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1b620 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
1b630 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1b640 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1b650 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1b660 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1b670 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1b680 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
1b690 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1b6a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1b6b0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1b6c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b6d0 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
1b6e0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1b6f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
1b700 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
1b710 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  LIZED);..}...cac
1b720 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1b730 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
1b740 74 69 76 65 20 3d 20 30 3b 0a 09 69 66 20 28 63  tive = 0;..if (c
1b750 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1b760 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1b770 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28  query) {...free(
1b780 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b790 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1b7a0 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75  _query);..}...mu
1b7b0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1b7c0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1b7d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1b7e0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1b7f0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1b800 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b810 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1b820 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1b830 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1b840 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1b850 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b860 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1b870 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1b880 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1b890 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1b8a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1b8b0 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
1b8c0 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  tInit)(CK_SESSIO
1b8d0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1b8e0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
1b8f0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
1b900 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1b910 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
1b920 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1b930 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1b940 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1b950 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1b960 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b970 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1b980 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1b990 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1b9a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1b9b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1b9c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1b9d0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1b9e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1b9f0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1ba00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1ba10 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1ba20 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1ba30 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1ba40 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1ba50 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
1ba60 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  pt)(CK_SESSION_H
1ba70 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1ba80 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
1ba90 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
1baa0 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
1bab0 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  TR pEncryptedDat
1bac0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
1bad0 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61  pulEncryptedData
1bae0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1baf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1bb00 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1bb10 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1bb20 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1bb30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1bb40 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1bb50 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1bb60 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1bb70 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1bb80 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1bb90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1bba0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1bbb0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1bbc0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1bbd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1bbe0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1bbf0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1bc00 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1bc10 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1bc20 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
1bc30 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
1bc40 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1bc50 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1bc60 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
1bc70 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  ulPartLen, CK_BY
1bc80 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
1bc90 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
1bca0 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
1bcb0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
1bcc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bcd0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1bce0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1bcf0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1bd00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bd10 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1bd20 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1bd30 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1bd40 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1bd50 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1bd60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1bd70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1bd80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1bd90 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1bda0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1bdb0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1bdc0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1bdd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1bde0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1bdf0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
1be00 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ryptFinal)(CK_SE
1be10 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1be20 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1be30 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65  TR pLastEncrypte
1be40 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
1be50 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79  PTR pulLastEncry
1be60 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
1be70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1be80 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1be90 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1bea0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1beb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bec0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1bed0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1bee0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1bef0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1bf00 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1bf10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bf20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1bf30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1bf40 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1bf50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1bf60 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1bf70 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1bf80 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1bf90 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1bfa0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1bfb0 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b  _DecryptInit)(CK
1bfc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1bfd0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
1bfe0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
1bff0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
1c000 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
1c010 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1c020 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43  l;...hKey--;...C
1c030 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c040 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c050 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1c060 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1c070 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c080 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1c090 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1c0a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1c0b0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1c0c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1c0d0 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e  (pMechanism == N
1c0e0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1c0f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c100 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20  ror. pMechanism 
1c110 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1c120 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1c130 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1c140 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  f (pMechanism->m
1c150 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
1c160 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41  RSA_PKCS) {...CA
1c170 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c180 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
1c190 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
1c1a0 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73  not specified as
1c1b0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b   CKM_RSA_PKCS");
1c1c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d  ....return(CKR_M
1c1d0 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49  ECHANISM_PARAM_I
1c1e0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
1c1f0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1c200 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1c210 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1c220 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1c230 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1c240 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1c250 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c260 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1c270 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1c280 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1c290 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1c2a0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1c2b0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1c2c0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1c2d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1c2e0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1c2f0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1c300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c310 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1c320 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1c330 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1c340 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1c350 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1c360 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1c370 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1c380 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1c390 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1c3a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c3b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c3c0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1c3d0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1c3e0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1c3f0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1c400 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1c410 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1c420 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
1c430 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1c440 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1c450 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1c460 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c470 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
1c480 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70  ypt already in p
1c490 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09  rogress.");.....
1c4a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
1c4b0 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09  ATION_ACTIVE);..
1c4c0 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20  }...if (hKey >= 
1c4d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c4e0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1c4f0 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ties_count) {...
1c500 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1c510 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1c520 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1c530 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c540 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20  or.  Key handle 
1c550 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65  out of range (re
1c560 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c  quested key %lu,
1c570 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69   only %lu identi
1c580 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e  ties available).
1c590 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1c5a0 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e  g) hKey, (unsign
1c5b0 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f  ed long) cackey_
1c5c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1c5d0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
1c5e0 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
1c5f0 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49  CKR_KEY_HANDLE_I
1c600 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
1c610 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1c620 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1c630 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61  active = 1;...ca
1c640 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1c650 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1c660 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
1c670 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
1c680 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  m;..cackey_sessi
1c690 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
1c6a0 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20  crypt_mech_parm 
1c6b0 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50  = pMechanism->pP
1c6c0 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65  arameter;..cacke
1c6d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1c6e0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
1c6f0 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63  h_parmlen = pMec
1c700 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65  hanism->ulParame
1c710 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f  terLen;..cackey_
1c720 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1c730 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74  n].decrypt_ident
1c740 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ity = &cackey_se
1c750 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1c760 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79  .identities[hKey
1c770 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  ];...mutex_retva
1c780 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1c790 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1c7a0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1c7b0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1c7c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c7d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c7e0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1c7f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c800 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1c810 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
1c820 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1c830 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1c840 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1c850 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1c860 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1c870 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1c880 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53  _Decrypt)(CK_SES
1c890 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1c8a0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1c8b0 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  R pEncryptedData
1c8c0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
1c8d0 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43  ryptedDataLen, C
1c8e0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
1c8f0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1c900 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b  ulDataLen) {..CK
1c910 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75  _ULONG datalen_u
1c920 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66  pdate, datalen_f
1c930 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63  inal;..CK_RV dec
1c940 72 79 70 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  rypt_ret;...CACK
1c950 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c960 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1c970 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1c980 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1c990 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c9a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1c9b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1c9c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1c9d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1c9e0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
1c9f0 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  lDataLen == NULL
1ca00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ca10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ca20 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20  . pulDataLen is 
1ca30 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1ca40 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1ca50 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61  _BAD);..}...data
1ca60 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75  len_update = *pu
1ca70 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72  lDataLen;...decr
1ca80 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72  ypt_ret = C_Decr
1ca90 79 70 74 55 70 64 61 74 65 28 68 53 65 73 73 69  yptUpdate(hSessi
1caa0 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61  on, pEncryptedDa
1cab0 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44  ta, ulEncryptedD
1cac0 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26  ataLen, pData, &
1cad0 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b  datalen_update);
1cae0 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
1caf0 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
1cb00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cb10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
1cb20 63 72 79 70 74 55 70 64 61 74 65 28 29 20 72 65  cryptUpdate() re
1cb30 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
1cb40 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
1cb50 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63  signed long) dec
1cb60 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65  rypt_ret);....re
1cb70 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74  turn(decrypt_ret
1cb80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74  );..}...if (pDat
1cb90 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20  a) {...pData += 
1cba0 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a  datalen_update;.
1cbb0 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61  .}..datalen_fina
1cbc0 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20  l = *pulDataLen 
1cbd0 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  - datalen_update
1cbe0 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20  ;...decrypt_ret 
1cbf0 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
1cc00 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61  (hSession, pData
1cc10 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  , &datalen_final
1cc20 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f  );..if (decrypt_
1cc30 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
1cc40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cc50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1cc60 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72  DecryptFinal() r
1cc70 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
1cc80 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
1cc90 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65  nsigned long) de
1cca0 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72  crypt_ret);....r
1ccb0 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65  eturn(decrypt_re
1ccc0 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74  t);..}...*pulDat
1ccd0 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75  aLen = datalen_u
1cce0 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f  pdate + datalen_
1ccf0 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  final;...CACKEY_
1cd00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1cd10 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1cd20 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1cd30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1cd40 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1cd50 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1cd60 44 65 63 72 79 70 74 55 70 64 61 74 65 29 28 43  DecryptUpdate)(C
1cd70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1cd80 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1cd90 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
1cda0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
1cdb0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
1cdc0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
1cdd0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
1cde0 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
1cdf0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54  {..static CK_BYT
1ce00 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73  E buf[16384];..s
1ce10 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09  size_t buflen;..
1ce20 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43  CK_RV retval = C
1ce30 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1ce40 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1ce50 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1ce60 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1ce70 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1ce80 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1ce90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1cea0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ceb0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1cec0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1ced0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1cee0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1cef0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1cf00 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1cf10 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1cf20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1cf30 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1cf40 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1cf50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cf60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1cf70 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1cf80 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1cf90 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1cfa0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1cfb0 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
1cfc0 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
1cfd0 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64 50   && ulEncryptedP
1cfe0 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
1cff0 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
1d000 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65  t if we are aske
1d010 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f 74  d to decrypt not
1d020 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43  hing... */...CAC
1d030 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d040 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1d050 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
1d060 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
1d070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d080 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
1d090 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d  EncryptedPart ==
1d0a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1d0b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d0c0 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 65  Error. pEncrypte
1d0d0 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62  dPart is NULL, b
1d0e0 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  ut ulEncryptedPa
1d0f0 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22  rtLen is not 0."
1d100 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d110 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1d120 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72  ..}...if (ulEncr
1d130 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20  yptedPartLen == 
1d140 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1d150 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d160 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  r. ulEncryptedPa
1d170 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20  rtLen is 0, but 
1d180 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  pPart is not NUL
1d190 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1d1a0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1d1b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
1d1c0 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  PartLen == NULL)
1d1d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d1e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d1f0 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e   pulPartLen is N
1d200 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1d210 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1d220 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
1d230 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1d240 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1d250 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1d260 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1d270 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1d280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d290 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1d2a0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1d2b0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1d2c0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1d2d0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1d2e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1d2f0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1d300 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1d310 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1d320 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d330 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1d340 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1d350 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1d360 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1d370 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1d380 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1d390 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1d3a0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
1d3b0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1d3c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1d3d0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1d3e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d3f0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
1d400 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1d410 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1d420 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
1d430 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1d440 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
1d450 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d460 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61  n].decrypt_mecha
1d470 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43  nism) {...case C
1d480 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  KM_RSA_PKCS:....
1d490 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20 64  /* Ask card to d
1d4a0 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 62 75 66  ecrypt */....buf
1d4b0 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67  len = cackey_sig
1d4c0 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79  ndecrypt(&cackey
1d4d0 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65  _slots[cackey_se
1d4e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1d4f0 2e 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  .slotID], cackey
1d500 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1d510 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
1d520 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64  tity, pEncrypted
1d530 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65  Part, ulEncrypte
1d540 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73  dPartLen, buf, s
1d550 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 0a 09 09  izeof(buf));....
1d560 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29  .if (buflen < 0)
1d570 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
1d580 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a  tion failed. */.
1d590 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
1d5a0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
1d5b0 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28  ...} else if (((
1d5c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
1d5d0 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72  uflen) > *pulPar
1d5e0 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b  tLen && pPart) {
1d5f0 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65  ...../* Decrypte
1d600 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65  d data too large
1d610 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d   */.....retval =
1d620 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
1d630 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65  SMALL;....} else
1d640 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72 74   {.....if (pPart
1d650 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  ) {......memcpy(
1d660 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c  pPart, buf, bufl
1d670 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  en);.....}......
1d680 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75  *pulPartLen = bu
1d690 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61  flen;......retva
1d6a0 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d  l = CKR_OK;....}
1d6b0 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
1d6c0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1d6d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1d6e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1d6f0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1d700 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1d710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d720 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1d730 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1d740 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d750 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1d760 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1d770 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1d780 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20  ning %i", (int) 
1d790 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
1d7a0 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b  n(retval);.}..CK
1d7b0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1d7c0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
1d7d0 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  tFinal)(CK_SESSI
1d7e0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1d7f0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1d800 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c  pLastPart, CK_UL
1d810 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50  ONG_PTR pulLastP
1d820 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d  artLen) {..int m
1d830 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
1d840 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72  t terminate_decr
1d850 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45  ypt = 1;...CACKE
1d860 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d870 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1d880 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1d890 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1d8a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d8b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1d8c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1d8d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1d8e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1d8f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1d900 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1d910 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1d920 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1d930 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1d940 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1d950 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d960 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d970 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1d980 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1d990 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1d9a0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1d9b0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ID);..}...if (pu
1d9c0 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20  lLastPartLen == 
1d9d0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1d9e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d9f0 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72  rror. pulLastPar
1da00 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  tLen is NULL.");
1da10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1da20 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1da30 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1da40 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1da50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1da60 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1da70 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1da80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1da90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1daa0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1dab0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1dac0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1dad0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1dae0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1daf0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1db00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1db10 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1db20 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1db30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1db40 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1db50 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1db60 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1db70 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1db80 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
1db90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1dba0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
1dbb0 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
1dbc0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1dbd0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1dbe0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1dbf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1dc00 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
1dc10 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1dc20 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
1dc30 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
1dc40 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61  ED);..}...*pulLa
1dc50 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a  stPartLen = 0;..
1dc60 09 69 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d  .if (pLastPart =
1dc70 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d  = NULL) {...term
1dc80 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20  inate_decrypt = 
1dc90 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  0;..}...if (term
1dca0 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b  inate_decrypt) {
1dcb0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1dcc0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
1dcd0 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
1dce0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1dcf0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1dd00 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1dd10 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1dd20 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1dd30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1dd40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1dd50 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1dd60 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1dd70 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1dd80 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1dd90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1dda0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1ddb0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1ddc0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1ddd0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1dde0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1ddf0 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b  C_DigestInit)(CK
1de00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1de10 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
1de20 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
1de30 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59  anism) {..CACKEY
1de40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1de50 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1de60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1de70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1de80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1de90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1dea0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1deb0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1dec0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1ded0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1dee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1def0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1df00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1df10 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1df20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1df30 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1df40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1df50 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1df60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1df70 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
1df80 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1df90 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1dfa0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
1dfb0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
1dfc0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
1dfd0 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c  R pDigest, CK_UL
1dfe0 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73  ONG_PTR pulDiges
1dff0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
1e000 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1e010 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1e020 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1e030 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1e040 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e050 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1e060 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1e070 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1e080 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1e090 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1e0a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1e0b0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1e0c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e0d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1e0e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1e0f0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1e100 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1e110 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1e120 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1e130 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
1e140 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
1e150 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1e160 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1e170 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
1e180 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
1e190 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e1a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1e1b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1e1c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1e1d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e1e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1e1f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1e200 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1e210 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1e220 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1e230 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e240 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1e250 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e260 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1e270 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e280 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1e290 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1e2a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1e2b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1e2c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
1e2d0 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53  igestKey)(CK_SES
1e2e0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1e2f0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
1e300 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
1e310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e320 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1e330 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1e340 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1e350 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e360 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1e370 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1e380 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1e390 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1e3a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1e3b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e3c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e3d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e3e0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1e3f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1e400 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1e410 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1e420 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1e430 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1e440 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1e450 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b  _DigestFinal)(CK
1e460 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1e470 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1e480 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43  E_PTR pDigest, C
1e490 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
1e4a0 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43  igestLen) {..CAC
1e4b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e4c0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1e4d0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1e4e0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1e4f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e500 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1e510 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1e520 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1e530 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1e540 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1e550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e560 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1e570 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1e580 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1e590 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e5a0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1e5b0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1e5c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1e5d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1e5e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
1e5f0 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  gnInit)(CK_SESSI
1e600 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1e610 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
1e620 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
1e630 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1e640 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d  E hKey) {..int m
1e650 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68  utex_retval;...h
1e660 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f  Key--;...CACKEY_
1e670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1e680 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1e690 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1e6a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1e6b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e6c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1e6d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1e6e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1e6f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1e700 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
1e710 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b  anism == NULL) {
1e720 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e730 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1e740 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c  Mechanism is NUL
1e750 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1e760 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1e770 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
1e780 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
1e790 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b  sm != CKM_RSA_PK
1e7a0 43 53 20 26 26 20 70 4d 65 63 68 61 6e 69 73 6d  CS && pMechanism
1e7b0 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43  ->mechanism != C
1e7c0 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
1e7d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e7e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e7f0 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  . pMechanism->me
1e800 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63  chanism not spec
1e810 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41  ified as CKM_RSA
1e820 5f 50 4b 43 53 20 6f 72 20 43 4b 4d 5f 53 48 41  _PKCS or CKM_SHA
1e830 31 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09  1_RSA_PKCS");...
1e840 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48  .return(CKR_MECH
1e850 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41  ANISM_PARAM_INVA
1e860 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  LID);..}...if (h
1e870 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1e880 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1e890 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1e8a0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1e8b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1e8c0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1e8d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e8e0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1e8f0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1e900 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1e910 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1e920 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1e930 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1e940 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1e950 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1e960 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1e970 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1e980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e990 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1e9a0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1e9b0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1e9c0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1e9d0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1e9e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1e9f0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1ea00 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1ea10 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1ea20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ea30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1ea40 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1ea50 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1ea60 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1ea70 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1ea80 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
1ea90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1eaa0 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
1eab0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1eac0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1ead0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1eae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1eaf0 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61  ror.  Sign alrea
1eb00 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22  dy in progress."
1eb10 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1eb20 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54  KR_OPERATION_ACT
1eb30 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  IVE);..}...if (h
1eb40 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65  Key >= cackey_se
1eb50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1eb60 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
1eb70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  t) {...cackey_mu
1eb80 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1eb90 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1eba0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ebb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20  TF("Error.  Key 
1ebc0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
1ebd0 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b  nge (requested k
1ebe0 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75  ey %lu, only %lu
1ebf0 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69   identities avai
1ec00 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67  lable).", (unsig
1ec10 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20  ned long) hKey, 
1ec20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1ec30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ec40 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
1ec50 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  ties_count);....
1ec60 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48  return(CKR_KEY_H
1ec70 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1ec80 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
1ec90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1eca0 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  ign_active = 1;.
1ecb0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1ecc0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
1ecd0 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65  _mechanism = pMe
1ece0 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
1ecf0 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  sm;...cackey_ses
1ed00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ed10 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32  sign_buflen = 12
1ed20 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  8;..cackey_sessi
1ed30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1ed40 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a  gn_bufused = 0;.
1ed50 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1ed60 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
1ed70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  buf = malloc(siz
1ed80 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
1ed90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1eda0 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
1edb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1edc0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
1edd0 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
1ede0 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f  G_PRINTF("Sessio
1edf0 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74  n %lu sign_ident
1ee00 69 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74  ity is %p (ident
1ee10 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73  ity #%lu)", (uns
1ee20 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73  igned long) hSes
1ee30 73 69 6f 6e 2c 20 26 63 61 63 6b 65 79 5f 73 65  sion, &cackey_se
1ee40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ee50 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79  .identities[hKey
1ee60 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ], (unsigned lon
1ee70 67 29 20 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65  g) hKey);..cacke
1ee80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1ee90 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69  ion].sign_identi
1eea0 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  ty = &cackey_ses
1eeb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1eec0 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d  identities[hKey]
1eed0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
1eee0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1eef0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1ef00 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1ef10 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1ef20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ef30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ef40 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1ef50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1ef60 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1ef70 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1ef80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1ef90 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1efa0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1efb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1efc0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1efd0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1efe0 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Sign)(CK_SESSION
1eff0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1f000 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
1f010 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
1f020 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
1f030 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
1f040 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1f050 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
1f060 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74  ..CK_RV sign_ret
1f070 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1f080 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1f090 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1f0a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f0b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f0c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f0d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f0e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f0f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f100 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f110 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53  ..sign_ret = C_S
1f120 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 69  ignUpdate(hSessi
1f130 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74  on, pData, ulDat
1f140 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e  aLen);..if (sign
1f150 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
1f160 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f170 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f180 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 65   SignUpdate() re
1f190 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
1f1a0 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
1f1b0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
1f1c0 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  n_ret);....retur
1f1d0 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a  n(sign_ret);..}.
1f1e0 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53  ..sign_ret = C_S
1f1f0 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 6f  ignFinal(hSessio
1f200 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c 20 70  n, pSignature, p
1f210 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b  ulSignatureLen);
1f220 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21  ..if (sign_ret !
1f230 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
1f240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f250 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46  F("Error.  SignF
1f260 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
1f270 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
1f280 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
1f290 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
1f2a0 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
1f2b0 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ret);..}...CACKE
1f2c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f2d0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1f2e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1f2f0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1f300 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1f310 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f320 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b  C_SignUpdate)(CK
1f330 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1f340 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1f350 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
1f360 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
1f370 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
1f380 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
1f390 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1f3a0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1f3b0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1f3c0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1f3d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f3e0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1f3f0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1f400 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1f410 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1f420 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
1f430 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
1f440 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
1f450 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1f460 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1f470 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
1f480 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f490 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f4a0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
1f4b0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
1f4c0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1f4d0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1f4e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74  ;..}...if (pPart
1f4f0 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61   == NULL && ulPa
1f500 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
1f510 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
1f520 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 64   if we are asked
1f530 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67   to sign nothing
1f540 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ... */...CACKEY_
1f550 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1f560 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1f570 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
1f580 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
1f590 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1f5a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74  ;..}...if (pPart
1f5b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1f5c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f5d0 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74 20  F("Error. pPart 
1f5e0 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50  is NULL, but ulP
1f5f0 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e  artLen is not 0.
1f600 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f610 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1f620 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72  ;..}...if (ulPar
1f630 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tLen == 0) {...C
1f640 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f650 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 72  TF("Error. ulPar
1f660 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70  tLen is 0, but p
1f670 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Part is not NULL
1f680 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f690 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1f6a0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1f6b0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1f6c0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1f6d0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1f6e0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1f6f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f700 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f710 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1f720 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f730 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1f740 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
1f750 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1f760 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
1f770 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1f780 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1f790 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1f7a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f7b0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1f7c0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1f7d0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1f7e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1f7f0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
1f800 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1f810 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1f820 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
1f830 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1f840 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f850 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1f860 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f870 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
1f880 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1f890 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
1f8a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1f8b0 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
1f8c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f8d0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
1f8e0 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
1f8f0 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
1f900 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74  ..../* Accumulat
1f910 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09  e directly */...
1f920 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65 73  .if ((cackey_ses
1f930 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1f940 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20 75  sign_bufused + u
1f950 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b  lPartLen) > cack
1f960 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1f970 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
1f980 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  n) {.....cackey_
1f990 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f9a0 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a  n].sign_buflen *
1f9b0 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  = 2;......cackey
1f9c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1f9d0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72  on].sign_buf = r
1f9e0 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65  ealloc(cackey_se
1f9f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1fa00 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f  .sign_buf, sizeo
1fa10 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f(*cackey_sessio
1fa20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1fa30 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f  n_buf) * cackey_
1fa40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1fa50 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b  n].sign_buflen);
1fa60 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79  ....}.....memcpy
1fa70 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1fa80 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
1fa90 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73  buf + cackey_ses
1faa0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1fab0 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50  sign_bufused, pP
1fac0 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b  art, ulPartLen);
1fad0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
1fae0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1faf0 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75  ign_bufused += u
1fb00 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72  lPartLen;.....br
1fb10 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  eak;...case CKM_
1fb20 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09  SHA1_RSA_PKCS:..
1fb30 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20  ../* Accumulate 
1fb40 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73 68  into a SHA1 hash
1fb50 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75   */....cackey_mu
1fb60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1fb70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
1fb80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fb90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1fba0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1fbb0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1fbc0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1fbd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1fbe0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1fbf0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1fc00 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  TED);....break;.
1fc10 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1fc20 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1fc30 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1fc40 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1fc50 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1fc60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fc70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fc80 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1fc90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1fca0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1fcb0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
1fcc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1fcd0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1fce0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1fcf0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1fd00 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1fd10 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1fd20 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53  _SignFinal)(CK_S
1fd30 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1fd40 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1fd50 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
1fd60 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1fd70 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
1fd80 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20  .static CK_BYTE 
1fd90 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73  sigbuf[1024];..s
1fda0 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c 65 6e  size_t sigbuflen
1fdb0 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
1fdc0 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
1fdd0 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e  ROR;..int termin
1fde0 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69  ate_sign = 1;..i
1fdf0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1fe00 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fe10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1fe20 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1fe30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1fe40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fe50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1fe60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1fe70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fe80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1fe90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1fea0 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72  .if (pulSignatur
1feb0 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  eLen == NULL) {.
1fec0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fed0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
1fee0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73  lSignatureLen is
1fef0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1ff00 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1ff10 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1ff20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
1ff30 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
1ff40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1ff50 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1ff60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ff70 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1ff80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ff90 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
1ffa0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
1ffb0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1ffc0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1ffd0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1ffe0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1fff0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
20000 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
20010 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
20020 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
20030 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20040 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
20050 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20060 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20070 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20080 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
20090 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
200a0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
200b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
200c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
200d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
200e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
200f0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
20100 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
20110 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
20120 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
20130 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
20140 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20150 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
20160 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
20170 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
20180 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
20190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
201a0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
201b0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
201c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
201d0 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
201e0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77  ALIZED);..}...sw
201f0 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
20200 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20210 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
20220 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
20230 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
20240 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f   card to sign */
20250 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20260 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20  _PRINTF("Asking 
20270 74 6f 20 64 65 63 72 79 70 74 20 66 72 6f 6d 20  to decrypt from 
20280 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73  identity %p in s
20290 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 63 61 63  ession %lu", cac
202a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
202b0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
202c0 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  tity, (unsigned 
202d0 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b  long) hSession);
202e0 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20  ....sigbuflen = 
202f0 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
20300 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
20310 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  [cackey_sessions
20320 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
20330 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
20340 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
20350 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63  gn_identity, cac
20360 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20370 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c  ssion].sign_buf,
20380 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
20390 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
203a0 62 75 66 6c 65 6e 2c 20 73 69 67 62 75 66 2c 20  buflen, sigbuf, 
203b0 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 29 3b  sizeof(sigbuf));
203c0 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c  .....if (sigbufl
203d0 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a  en < 0) {...../*
203e0 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e   Signing failed.
203f0 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d   */.....retval =
20400 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
20410 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 66  OR;....} else if
20420 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   (((unsigned lon
20430 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20  g) sigbuflen) > 
20440 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
20450 20 26 26 20 70 53 69 67 6e 61 74 75 72 65 29 20   && pSignature) 
20460 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20  {...../* Signed 
20470 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a  data too large *
20480 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  /.....retval = C
20490 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
204a0 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e  ALL;......termin
204b0 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09  ate_sign = 0;...
204c0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65  .} else {.....te
204d0 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30  rminate_sign = 0
204e0 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 6e  ;......if (pSign
204f0 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d 65  ature) {......me
20500 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 2c  mcpy(pSignature,
20510 20 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 6c   sigbuf, sigbufl
20520 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69  en);.......termi
20530 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
20540 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69  ...}......*pulSi
20550 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 67  gnatureLen = sig
20560 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
20570 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
20580 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
20590 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53  case CKM_SHA1_RS
205a0 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63  A_PKCS:..../* Ac
205b0 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f 20 61 20  cumulate into a 
205c0 53 48 41 31 20 68 61 73 68 20 2a 2f 0a 09 09 09  SHA1 hash */....
205d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
205e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
205f0 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ck);.....CACKEY_
20600 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20610 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
20620 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20630 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
20640 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20650 52 54 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72  RTED);.....retur
20660 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
20670 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09  OT_SUPPORTED);..
20680 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66  ..break;..}...if
20690 20 28 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e   (terminate_sign
206a0 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
206b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
206c0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a  on].sign_buf) {.
206d0 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
206e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
206f0 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d  ].sign_buf);...}
20700 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
20710 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
20720 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  gn_active = 0;..
20730 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
20740 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
20750 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20760 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
20770 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
20780 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20790 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
207a0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
207b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
207c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
207d0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
207e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
207f0 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
20800 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  t) retval);...re
20810 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
20820 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
20830 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
20840 6e 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b  nRecoverInit)(CK
20850 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
20860 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
20870 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
20880 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
20890 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
208a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
208b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
208c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
208d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
208e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
208f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20900 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20910 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20920 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20930 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
20940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20950 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20960 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20970 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
20980 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20990 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
209a0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
209b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
209c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
209d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
209e0 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43  C_SignRecover)(C
209f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
20a00 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
20a10 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
20a20 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
20a30 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
20a40 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
20a50 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
20a60 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ureLen) {..CACKE
20a70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20a80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
20a90 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20aa0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20ab0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20ac0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20ad0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20ae0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20af0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20b00 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
20b10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20b20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
20b30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20b40 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
20b50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20b60 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
20b70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20b80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
20b90 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20ba0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
20bb0 66 79 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  fyInit)(CK_SESSI
20bc0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
20bd0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
20be0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
20bf0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
20c00 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
20c10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20c20 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
20c30 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20c40 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20c60 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20c70 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20c80 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20c90 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20ca0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
20cb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20cc0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
20cd0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20ce0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
20cf0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20d00 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
20d10 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20d20 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
20d30 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20d40 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
20d50 66 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  fy)(CK_SESSION_H
20d60 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
20d70 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
20d80 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
20d90 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
20da0 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
20db0 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74  K_ULONG ulSignat
20dc0 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ureLen) {..CACKE
20dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20de0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
20df0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20e00 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20e10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20e20 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20e30 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20e40 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20e50 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20e60 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
20e70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20e80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
20e90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20ea0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
20eb0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20ec0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
20ed0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20ee0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
20ef0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20f00 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
20f10 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  fyUpdate)(CK_SES
20f20 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
20f30 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
20f40 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
20f50 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09  G ulPartLen) {..
20f60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20f70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20f80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
20f90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
20fa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20fb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
20fc0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
20fd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
20fe0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
20ff0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
21000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21010 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21020 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21030 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
21040 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21050 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
21060 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
21070 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21080 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
21090 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
210a0 5f 56 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b  _VerifyFinal)(CK
210b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
210c0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
210d0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
210e0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67  , CK_ULONG ulSig
210f0 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41  natureLen) {..CA
21100 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21110 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21120 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21130 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21150 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
21160 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21170 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21180 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
21190 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
211a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
211b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
211c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
211d0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
211e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
211f0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
21200 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
21210 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21220 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21230 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
21240 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74  erifyRecoverInit
21250 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
21260 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
21270 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
21280 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
21290 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
212a0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
212b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
212c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
212d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
212e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
212f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21300 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
21310 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21320 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
21330 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
21340 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21350 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
21360 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
21370 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
21380 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
21390 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
213a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
213b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
213c0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
213d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
213e0 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f  RV, C_VerifyReco
213f0 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ver)(CK_SESSION_
21400 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
21410 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
21420 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
21430 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
21440 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
21450 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
21460 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a  R pulDataLen) {.
21470 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21480 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21490 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
214a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
214b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
214c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
214d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
214e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
214f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
21500 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
21510 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21520 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
21530 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
21540 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
21550 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21560 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
21570 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
21580 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
21590 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
215a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
215b0 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55  C_DigestEncryptU
215c0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
215d0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
215e0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
215f0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
21600 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
21610 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
21620 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
21630 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
21640 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
21650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21660 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21670 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21680 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21690 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
216a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
216b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
216c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
216d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
216e0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
216f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
21700 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
21710 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21720 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
21730 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21740 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
21750 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21760 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
21770 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
21780 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
21790 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65 29  yptDigestUpdate)
217a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
217b0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
217c0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
217d0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
217e0 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
217f0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
21800 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
21810 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
21820 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
21830 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
21840 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
21850 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
21860 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21870 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21880 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
21890 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
218a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
218b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
218c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
218d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
218e0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
218f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
21900 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
21910 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
21920 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
21930 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21940 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
21950 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
21960 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70  RV, C_SignEncryp
21970 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
21980 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
21990 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
219a0 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
219b0 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42   ulPartLen, CK_B
219c0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
219d0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
219e0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
219f0 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
21a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21a10 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
21a20 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
21a30 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
21a40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21a50 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
21a60 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
21a70 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
21a80 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
21a90 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
21aa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21ab0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
21ac0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21ad0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
21ae0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21af0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
21b00 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
21b10 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
21b20 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
21b30 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
21b40 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74  cryptVerifyUpdat
21b50 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
21b60 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
21b70 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
21b80 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
21b90 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
21ba0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
21bb0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
21bc0 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
21bd0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
21be0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
21bf0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
21c00 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
21c10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21c20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21c30 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
21c40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21c50 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
21c60 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
21c70 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
21c80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21c90 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
21ca0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
21cb0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
21cc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
21cd0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
21ce0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21cf0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
21d00 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
21d10 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
21d20 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
21d30 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
21d40 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
21d50 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
21d60 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
21d70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
21d80 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
21d90 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
21da0 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45   phKey) {..CACKE
21db0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21dc0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21dd0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21de0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21df0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21e00 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21e10 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21e20 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21e30 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
21e40 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
21e50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
21e60 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
21e70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21e80 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
21e90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21ea0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
21eb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21ec0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
21ed0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
21ee0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65  ON(CK_RV, C_Gene
21ef0 72 61 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f  rateKeyPair)(CK_
21f00 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
21f10 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
21f20 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
21f30 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55  nism, CK_ATTRIBU
21f40 54 45 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65  TE_PTR pPublicKe
21f50 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  yTemplate, CK_UL
21f60 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41  ONG ulPublicKeyA
21f70 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
21f80 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
21f90 70 50 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c  pPrivateKeyTempl
21fa0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
21fb0 50 72 69 76 61 74 65 4b 65 79 41 74 74 72 69 62  PrivateKeyAttrib
21fc0 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
21fd0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
21fe0 68 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f  hPublicKey, CK_O
21ff0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
22000 20 70 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b   phPrivateKey) {
22010 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22020 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22030 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22040 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22050 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22060 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22070 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22080 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22090 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
220a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
220b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
220c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
220d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
220e0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
220f0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22100 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
22110 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
22120 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22130 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
22140 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22150 20 43 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53   C_WrapKey)(CK_S
22160 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
22170 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
22180 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
22190 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
221a0 41 4e 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b  ANDLE hWrappingK
221b0 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  ey, CK_OBJECT_HA
221c0 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59  NDLE hKey, CK_BY
221d0 54 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b  TE_PTR pWrappedK
221e0 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ey, CK_ULONG_PTR
221f0 20 70 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65   pulWrappedKeyLe
22200 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
22210 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22220 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
22230 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
22240 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22250 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22260 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
22270 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22280 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
22290 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
222a0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
222b0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
222c0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
222d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
222e0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
222f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22300 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
22310 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22320 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
22330 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22340 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79  _RV, C_UnwrapKey
22350 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
22360 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
22370 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
22380 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
22390 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77  JECT_HANDLE hUnw
223a0 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42  rappingKey, CK_B
223b0 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65 64  YTE_PTR pWrapped
223c0 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Key, CK_ULONG ul
223d0 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43  WrappedKeyLen, C
223e0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
223f0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
22400 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43  ONG ulAttributeC
22410 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
22420 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
22430 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
22440 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
22450 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
22460 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
22470 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22480 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22490 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
224a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
224b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
224c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
224d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
224e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
224f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
22500 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
22510 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
22520 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22530 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
22540 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22550 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
22560 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22570 52 56 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29  RV, C_DeriveKey)
22580 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
22590 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
225a0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
225b0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
225c0 45 43 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65  ECT_HANDLE hBase
225d0 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  Key, CK_ATTRIBUT
225e0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
225f0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72   CK_ULONG ulAttr
22600 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f  ibuteCount, CK_O
22610 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
22620 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45   phKey) {..CACKE
22630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22640 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
22650 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
22660 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
22670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22680 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
22690 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
226a0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
226b0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
226c0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
226d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
226e0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
226f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22700 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
22710 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22720 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
22730 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22740 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
22750 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
22760 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64  ON(CK_RV, C_Seed
22770 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49  Random)(CK_SESSI
22780 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
22790 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
227a0 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pSeed, CK_ULONG 
227b0 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41  ulSeedLen) {..CA
227c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
227d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
227e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
227f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22800 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22810 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22820 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22830 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22840 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22850 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
22860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22870 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
22880 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22890 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
228a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
228b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
228c0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
228d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
228e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
228f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
22900 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43  enerateRandom)(C
22910 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22920 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
22930 54 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61  TE_PTR pRandomDa
22940 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52  ta, CK_ULONG ulR
22950 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43  andomLen) {..CAC
22960 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22970 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
22980 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
22990 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
229a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
229b0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
229c0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
229d0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
229e0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
229f0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
22a00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22a10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
22a20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22a30 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
22a40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22a50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
22a60 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
22a70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
22a80 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20  ../* Deprecated 
22a90 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44  Function */.CK_D
22aa0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22ab0 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74  K_RV, C_GetFunct
22ac0 69 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45  ionStatus)(CK_SE
22ad0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
22ae0 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59  ssion) {..CACKEY
22af0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
22b00 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b  alled.");...CACK
22b10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22b20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
22b30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
22b40 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f  LLEL (%i)", CKR_
22b50 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
22b60 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e  ALLEL);...return
22b70 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
22b80 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68  T_PARALLEL);...h
22b90 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69  Session = hSessi
22ba0 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  on; /* Supress u
22bb0 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
22bc0 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20  arning */.}../* 
22bd0 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74  Deprecated Funct
22be0 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  ion */.CK_DEFINE
22bf0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22c00 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f   C_CancelFunctio
22c10 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
22c20 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
22c30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22c40 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22c50 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
22c60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
22c70 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
22c80 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69  NOT_PARALLEL (%i
22c90 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
22ca0 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
22cb0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
22cc0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
22cd0 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20  EL);...hSession 
22ce0 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53  = hSession; /* S
22cf0 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61  upress unused va
22d00 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a  riable warning *
22d10 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  /.}..CK_DEFINE_F
22d20 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22d30 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74  _GetFunctionList
22d40 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49  )(CK_FUNCTION_LI
22d50 53 54 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e  ST_PTR_PTR ppFun
22d60 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b  ctionList) {..CK
22d70 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50  _FUNCTION_LIST_P
22d80 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  TR pFunctionList
22d90 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
22da0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22db0 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e 63  ");...if (ppFunc
22dc0 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  tionList == NULL
22dd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22de0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22df0 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  . ppFunctionList
22e00 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
22e10 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
22e20 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
22e30 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  pFunctionList = 
22e40 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
22e50 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a  FunctionList));.
22e60 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
22e70 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  >version.major =
22e80 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
22e90 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
22ea0 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
22eb0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
22ec0 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  version.minor = 
22ed0 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
22ee0 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
22ef0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
22f00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
22f10 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f  _Initialize = C_
22f20 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75  Initialize;..pFu
22f30 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
22f40 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c  nalize = C_Final
22f50 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ize;..pFunctionL
22f60 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d  ist->C_GetInfo =
22f70 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75   C_GetInfo;..pFu
22f80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
22f90 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65  tSlotList = C_Ge
22fa0 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e  tSlotList;..pFun
22fb0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
22fc0 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74  SlotInfo = C_Get
22fd0 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  SlotInfo;..pFunc
22fe0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54  tionList->C_GetT
22ff0 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74  okenInfo = C_Get
23000 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e  TokenInfo;..pFun
23010 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69  ctionList->C_Wai
23020 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20  tForSlotEvent = 
23030 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65  C_WaitForSlotEve
23040 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  nt;..pFunctionLi
23050 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69  st->C_GetMechani
23060 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65  smList = C_GetMe
23070 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46  chanismList;..pF
23080 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
23090 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20  etMechanismInfo 
230a0 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  = C_GetMechanism
230b0 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
230c0 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65  List->C_InitToke
230d0 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b  n = C_InitToken;
230e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
230f0 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49  >C_InitPIN = C_I
23100 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69  nitPIN;..pFuncti
23110 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e  onList->C_SetPIN
23120 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46   = C_SetPIN;..pF
23130 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f  unctionList->C_O
23140 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f  penSession = C_O
23150 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75  penSession;..pFu
23160 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c  nctionList->C_Cl
23170 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43  oseSession = C_C
23180 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46  loseSession;..pF
23190 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
231a0 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20  loseAllSessions 
231b0 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73  = C_CloseAllSess
231c0 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ions;..pFunction
231d0 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69  List->C_GetSessi
231e0 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65  onInfo = C_GetSe
231f0 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e  ssionInfo;..pFun
23200 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
23210 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d  OperationState =
23220 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_GetOperationS
23230 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tate;..pFunction
23240 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61  List->C_SetOpera
23250 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65  tionState = C_Se
23260 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b  tOperationState;
23270 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
23280 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67  >C_Login = C_Log
23290 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  in;..pFunctionLi
232a0 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43  st->C_Logout = C
232b0 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74  _Logout;..pFunct
232c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74  ionList->C_Creat
232d0 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61  eObject = C_Crea
232e0 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63  teObject;..pFunc
232f0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79  tionList->C_Copy
23300 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f  Object = C_CopyO
23310 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f  bject;..pFunctio
23320 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79  nList->C_Destroy
23330 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72  Object = C_Destr
23340 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63  oyObject;..pFunc
23350 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f  tionList->C_GetO
23360 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65  bjectSize = C_Ge
23370 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46  tObjectSize;..pF
23380 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
23390 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
233a0 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75 74   = C_GetAttribut
233b0 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69  eValue;..pFuncti
233c0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74  onList->C_SetAtt
233d0 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f  ributeValue = C_
233e0 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  SetAttributeValu
233f0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
23400 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
23410 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a  Init = C_FindObj
23420 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63  ectsInit;..pFunc
23430 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
23440 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64  Objects = C_Find
23450 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74  Objects;..pFunct
23460 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f  ionList->C_FindO
23470 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f  bjectsFinal = C_
23480 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c  FindObjectsFinal
23490 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
234a0 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20  ->C_EncryptInit 
234b0 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b  = C_EncryptInit;
234c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
234d0 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45  >C_Encrypt = C_E
234e0 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69  ncrypt;..pFuncti
234f0 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
23500 74 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72  tUpdate = C_Encr
23510 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
23520 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
23530 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e  ryptFinal = C_En
23540 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75  cryptFinal;..pFu
23550 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
23560 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65  cryptInit = C_De
23570 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e  cryptInit;..pFun
23580 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
23590 72 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74  rypt = C_Decrypt
235a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
235b0 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  ->C_DecryptUpdat
235c0 65 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64  e = C_DecryptUpd
235d0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
235e0 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 69  ist->C_DecryptFi
235f0 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 46  nal = C_DecryptF
23600 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
23610 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e  List->C_DigestIn
23620 69 74 20 3d 20 43 5f 44 69 67 65 73 74 49 6e 69  it = C_DigestIni
23630 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
23640 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 5f  t->C_Digest = C_
23650 44 69 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 69  Digest;..pFuncti
23660 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
23670 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73  Update = C_Diges
23680 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
23690 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
236a0 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 73 74 4b  tKey = C_DigestK
236b0 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
236c0 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e 61  st->C_DigestFina
236d0 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 69 6e 61  l = C_DigestFina
236e0 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
236f0 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20  t->C_SignInit = 
23700 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75  C_SignInit;..pFu
23710 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
23720 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46  gn = C_Sign;..pF
23730 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
23740 69 67 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 69  ignUpdate = C_Si
23750 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  gnUpdate;..pFunc
23760 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
23770 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69  Final = C_SignFi
23780 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
23790 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76  ist->C_SignRecov
237a0 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52  erInit = C_SignR
237b0 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75  ecoverInit;..pFu
237c0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
237d0 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 69  gnRecover = C_Si
237e0 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e  gnRecover;..pFun
237f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
23800 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 69  ifyInit = C_Veri
23810 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  fyInit;..pFuncti
23820 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
23830 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 46   = C_Verify;..pF
23840 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
23850 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f  erifyUpdate = C_
23860 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70  VerifyUpdate;..p
23870 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
23880 56 65 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f  VerifyFinal = C_
23890 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46  VerifyFinal;..pF
238a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
238b0 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74  erifyRecoverInit
238c0 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76   = C_VerifyRecov
238d0 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
238e0 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
238f0 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 69  Recover = C_Veri
23900 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e  fyRecover;..pFun
23910 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
23920 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65  estEncryptUpdate
23930 20 3d 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79   = C_DigestEncry
23940 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
23950 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
23960 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65 20  yptDigestUpdate 
23970 3d 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73  = C_DecryptDiges
23980 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
23990 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45  ionList->C_SignE
239a0 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
239b0 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61  _SignEncryptUpda
239c0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
239d0 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 72  st->C_DecryptVer
239e0 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 44 65  ifyUpdate = C_De
239f0 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74  cryptVerifyUpdat
23a00 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
23a10 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  t->C_GenerateKey
23a20 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79   = C_GenerateKey
23a30 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
23a40 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  ->C_GenerateKeyP
23a50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 65  air = C_Generate
23a60 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 74  KeyPair;..pFunct
23a70 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b  ionList->C_WrapK
23a80 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a  ey = C_WrapKey;.
23a90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
23aa0 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f  C_UnwrapKey = C_
23ab0 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e  UnwrapKey;..pFun
23ac0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72  ctionList->C_Der
23ad0 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 76  iveKey = C_Deriv
23ae0 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  eKey;..pFunction
23af0 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64  List->C_SeedRand
23b00 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f  om = C_SeedRando
23b10 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  m;..pFunctionLis
23b20 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 6e  t->C_GenerateRan
23b30 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 65  dom = C_Generate
23b40 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69  Random;..pFuncti
23b50 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e  onList->C_GetFun
23b60 63 74 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f  ctionStatus = C_
23b70 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75  GetFunctionStatu
23b80 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
23b90 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74  t->C_CancelFunct
23ba0 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75  ion = C_CancelFu
23bb0 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  nction;..pFuncti
23bc0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e  onList->C_GetFun
23bd0 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65  ctionList = C_Ge
23be0 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  tFunctionList;..
23bf0 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  .*ppFunctionList
23c00 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   = pFunctionList
23c10 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
23c20 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23c30 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
23c40 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
23c50 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a     rn(CKR_OK);.}..