Hex Artifact Content

Artifact 941bf5cf9b3d394d757c721d999be71c9d56043a:


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 5a 4c 49 42 5f  ifdef HAVE_ZLIB_
01e0: 48 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  H.#  ifdef HAVE_
01f0: 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64  LIBZ.#    includ
0200: 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e  e <zlib.h>.#  en
0210: 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64  dif.#else.#  ifd
0220: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0230: 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42    undef HAVE_LIB
0240: 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  Z.#  endif.#endi
0250: 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f 50 54  f..#define CK_PT
0260: 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  R *.#define CK_D
0270: 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 72  EFINE_FUNCTION(r
0280: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
0290: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65   returnType name
02a0: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c  .#define CK_DECL
02b0: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74  ARE_FUNCTION(ret
02c0: 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72  urnType, name) r
02d0: 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23  eturnType name.#
02e0: 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52  define CK_DECLAR
02f0: 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54  E_FUNCTION_POINT
0300: 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e  ER(returnType, n
0310: 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20  ame) returnType 
0320: 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69 6e 65  (* name).#define
0330: 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46 55 4e   CK_CALLBACK_FUN
0340: 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 65  CTION(returnType
0350: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0360: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69 66 6e  pe (* name).#ifn
0370: 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23 20 20  def NULL_PTR.#  
0380: 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54 52 20  define NULL_PTR 
0390: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75  0.#endif..#inclu
03a0: 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a 23 69  de "pkcs11.h".#i
03b0: 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35 30  nclude "asn1-x50
03c0: 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 43 41  9.h"..#ifndef CA
03d0: 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
03e0: 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20 64 65  RSION_CODE.#  de
03f0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52 59 50  fine CACKEY_CRYP
0400: 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
0410: 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e 64 69  E 0x021e00.#endi
0420: 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41 5f 54  f..#ifndef CKA_T
0430: 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48  RUST_SERVER_AUTH
0440: 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41 5f 54  .#  define CKA_T
0450: 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48  RUST_SERVER_AUTH
0460: 20 30 78 63 65 35 33 36 33 35 38 0a 23 65 6e 64   0xce536358.#end
0470: 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41 5f 54  if.#ifndef CKA_T
0480: 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48  RUST_CLIENT_AUTH
0490: 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41 5f 54  .#  define CKA_T
04a0: 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48  RUST_CLIENT_AUTH
04b0: 20 30 78 63 65 35 33 36 33 35 39 0a 23 65 6e 64   0xce536359.#end
04c0: 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41 5f 54  if.#ifndef CKA_T
04d0: 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e  RUST_CODE_SIGNIN
04e0: 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41 5f  G.#  define CKA_
04f0: 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49  TRUST_CODE_SIGNI
0500: 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a 23 65  NG 0xce53635a.#e
0510: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
0520: 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f  _TRUST_EMAIL_PRO
0530: 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66 69 6e  TECTION.#  defin
0540: 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49  e CKA_TRUST_EMAI
0550: 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30 78 63  L_PROTECTION 0xc
0560: 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66 0a 0a  e53635b.#endif..
0570: 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44  /* GSC-IS v2.1 D
0580: 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a  efinitions */./*
0590: 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64  * Classes **/.#d
05a0: 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53  efine GSCIS_CLAS
05b0: 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20 20 20  S_ISO7816       
05c0: 20 20 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65      0x00.#define
05d0: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f   GSCIS_CLASS_GLO
05e0: 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30  BAL_PLATFORM   0
05f0: 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63  x80../** Instruc
0600: 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e  tions **/.#defin
0610: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0620: 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20  T_RESPONSE      
0630: 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0xC0.#define GSC
0640: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49  IS_INSTR_READ_BI
0650: 4e 41 52 59 20 20 20 20 20 20 20 30 78 42 30 0a  NARY       0xB0.
0660: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0670: 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52  STR_UPDATE_BINAR
0680: 59 20 20 20 20 20 30 78 44 36 0a 23 64 65 66 69  Y     0xD6.#defi
0690: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
06a0: 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20  ELECT           
06b0: 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53   0xA4.#define GS
06c0: 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e  CIS_INSTR_EXTERN
06d0: 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78 38 32  AL_AUTH     0x82
06e0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
06f0: 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e  NSTR_GET_CHALLEN
0700: 47 45 20 20 20 20 20 30 78 38 34 0a 23 64 65 66  GE     0x84.#def
0710: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0720: 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20  INTERNAL_AUTH   
0730: 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47    0x88.#define G
0740: 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
0750: 59 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32  Y            0x2
0760: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0770: 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20 20 20  INSTR_SIGN      
0780: 20 20 20 20 20 20 20 20 30 78 32 41 0a 23 64 65          0x2A.#de
0790: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
07a0: 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20 20 20  _GET_PROP       
07b0: 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e 65 20     0x56.#define 
07c0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
07d0: 41 43 52 20 20 20 20 20 20 20 20 20 20 20 30 78  ACR           0x
07e0: 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  4C.#define GSCIS
07f0: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46  _INSTR_READ_BUFF
0800: 45 52 20 20 20 20 20 20 20 30 78 35 32 0a 23 64  ER       0x52.#d
0810: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0820: 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20 20 20  R_SIGNDECRYPT   
0830: 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66 69 6e      0x42..#defin
0840: 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45  e GSCIS_PARAM_SE
0850: 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20 20 20  LECT_APPLET     
0860: 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a  0x04../** Tags *
0870: 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73  */./*** CCC Tags
0880: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0890: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 20 20  CIS_TAG_CARDID  
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 30              0xF0
08b0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
08c0: 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20 20 20  AG_CCC_VER      
08d0: 20 20 20 20 20 20 20 30 78 46 31 0a 23 64 65 66         0xF1.#def
08e0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43  ine GSCIS_TAG_CC
08f0: 47 5f 56 45 52 20 20 20 20 20 20 20 20 20 20 20  G_VER           
0900: 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65 20 47    0xF2.#define G
0910: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46               0xF
0930: 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  3.#define GSCIS_
0940: 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20 20 20  TAG_PKCS15      
0950: 20 20 20 20 20 20 20 20 30 78 46 34 0a 23 64 65          0xF4.#de
0960: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52  fine GSCIS_TAG_R
0970: 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20  EG_DATA_MODEL   
0980: 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e 65 20     0xF5.#define 
0990: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
09a0: 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 30 78  BLE           0x
09b0: 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  F6.#define GSCIS
09c0: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 20 20  _TAG_CARD_APDU  
09d0: 20 20 20 20 20 20 20 20 20 30 78 46 37 0a 23 64           0xF7.#d
09e0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
09f0: 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20 20 20  REDIRECTION     
0a00: 20 20 20 20 30 78 46 41 0a 23 64 65 66 69 6e 65      0xFA.#define
0a10: 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20 20 20   GSCIS_TAG_CT   
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0a30: 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xFB.#define GSCI
0a40: 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20 20 20  S_TAG_ST        
0a50: 20 20 20 20 20 20 20 20 20 20 30 78 46 43 0a 23            0xFC.#
0a60: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0a70: 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20 20 20  _NEXTCCC        
0a80: 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20       0xFD../*** 
0a90: 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32 32 30  General - EF 220
0aa0: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
0ab0: 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20  SCIS_TAG_FNAME  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0ad0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
0ae0: 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20  TAG_MNAME       
0af0: 20 20 20 20 20 20 20 20 30 78 30 32 0a 23 64 65          0x02.#de
0b00: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4c  fine GSCIS_TAG_L
0b10: 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 20  NAME            
0b20: 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e 65 20     0x03.#define 
0b30: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0b50: 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  04.#define GSCIS
0b60: 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59  _TAG_GOVT_AGENCY
0b70: 20 20 20 20 20 20 20 20 20 30 78 30 35 0a 23 64           0x05.#d
0b80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0b90: 42 55 52 45 41 55 20 20 20 20 20 20 20 20 20 20  BUREAU          
0ba0: 20 20 20 20 30 78 30 36 0a 23 64 65 66 69 6e 65      0x06.#define
0bb0: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41   GSCIS_TAG_BUREA
0bc0: 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20 20 30  U_CODE         0
0bd0: 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x07.#define GSCI
0be0: 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 20  S_TAG_DEPT_CODE 
0bf0: 20 20 20 20 20 20 20 20 20 20 30 78 30 38 0a 23            0x08.#
0c00: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0c10: 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20 20 20  _TITLE          
0c20: 20 20 20 20 20 30 78 30 39 0a 23 64 65 66 69 6e       0x09.#defin
0c30: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c  e GSCIS_TAG_BUIL
0c40: 44 49 4e 47 20 20 20 20 20 20 20 20 20 20 20 20  DING            
0c50: 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x10.#define GSC
0c60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44  IS_TAG_OFFICE_AD
0c70: 44 52 31 20 20 20 20 20 20 20 20 30 78 31 31 0a  DR1        0x11.
0c80: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c90: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 20 20  G_OFFICE_ADDR2  
0ca0: 20 20 20 20 20 20 30 78 31 32 0a 23 64 65 66 69        0x12.#defi
0cb0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0cc0: 49 43 45 5f 43 49 54 59 20 20 20 20 20 20 20 20  ICE_CITY        
0cd0: 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20 47 53   0x13.#define GS
0ce0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
0cf0: 54 41 54 45 20 20 20 20 20 20 20 20 30 78 31 34  TATE        0x14
0d00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0d10: 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20 20 20  AG_OFFICE_ZIP   
0d20: 20 20 20 20 20 20 20 30 78 31 35 0a 23 64 65 66         0x15.#def
0d30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0d40: 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20 20 20  FICE_COUNTRY    
0d50: 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65 20 47    0x16.#define G
0d60: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
0d70: 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30 78 31  PHONE        0x1
0d80: 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  7.#define GSCIS_
0d90: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
0da0: 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23 64 65  _EXT    0x18.#de
0db0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0dc0: 46 46 49 43 45 5f 46 41 58 20 20 20 20 20 20 20  FFICE_FAX       
0dd0: 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e 65 20     0x19.#define 
0de0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0df0: 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20 30 78  _EMAIL        0x
0e00: 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  1A.#define GSCIS
0e10: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d  _TAG_OFFICE_ROOM
0e20: 20 20 20 20 20 20 20 20 20 30 78 31 42 0a 23 64           0x1B.#d
0e30: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0e40: 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20 20 20  NONGOV_AGENCY   
0e50: 20 20 20 20 30 78 31 43 0a 23 64 65 66 69 6e 65      0x1C.#define
0e60: 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44   GSCIS_TAG_SSN_D
0e70: 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20 20 30  ESIGNATOR      0
0e80: 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20  x1D../*** PII - 
0e90: 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65  EF 2100 ***/.#de
0ea0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0eb0: 53 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  SN              
0ec0: 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e 65 20     0x20.#define 
0ed0: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20 20 20  GSCIS_TAG_DOB   
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0ef0: 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  21.#define GSCIS
0f00: 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20 20 20  _TAG_GENDER     
0f10: 20 20 20 20 20 20 20 20 20 30 78 32 32 0a 0a 2f           0x22../
0f20: 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d  *** Login Inform
0f30: 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30 30 20  ation - EF 4000 
0f40: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
0f50: 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20 20 20  IS_TAG_USERID   
0f60: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 30 0a             0x40.
0f70: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0f80: 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20 20 20  G_DOMAIN        
0f90: 20 20 20 20 20 20 30 78 34 31 0a 23 64 65 66 69        0x41.#defi
0fa0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53  ne GSCIS_TAG_PAS
0fb0: 53 57 4f 52 44 20 20 20 20 20 20 20 20 20 20 20  SWORD           
0fc0: 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64   0x42../*** Card
0fd0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45   Information - E
0fe0: 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66  F 5000 ***/.#def
0ff0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ine GSCIS_TAG_IS
1000: 53 55 45 52 49 44 20 20 20 20 20 20 20 20 20 20  SUERID          
1010: 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65 20 47    0x50.#define G
1020: 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20  SCIS_TAG_SERNO  
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 35               0x5
1040: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
1050: 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45 20 20  TAG_ISSUE_DATE  
1060: 20 20 20 20 20 20 20 20 30 78 35 32 0a 23 64 65          0x52.#de
1070: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 45  fine GSCIS_TAG_E
1080: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 20 20  XPIRE_DATE      
1090: 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e 65 20     0x53.#define 
10a0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54  GSCIS_TAG_CARD_T
10b0: 59 50 45 20 20 20 20 20 20 20 20 20 20 20 30 78  YPE           0x
10c0: 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  54.#define GSCIS
10d0: 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f  _TAG_SECURITY_CO
10e0: 44 45 20 20 20 20 20 20 20 30 78 35 37 0a 23 64  DE       0x57.#d
10f0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1100: 43 41 52 44 49 44 5f 41 49 44 20 20 20 20 20 20  CARDID_AID      
1110: 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50      0x58../*** P
1120: 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  KI Information -
1130: 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 7000 ***/.#d
1140: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1150: 43 45 52 54 49 46 49 43 41 54 45 20 20 20 20 20  CERTIFICATE     
1160: 20 20 20 20 30 78 37 30 0a 23 64 65 66 69 6e 65      0x70.#define
1170: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f   GSCIS_TAG_CERT_
1180: 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20 30  ISSUE_DATE     0
1190: 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x71.#define GSCI
11a0: 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52  S_TAG_CERT_EXPIR
11b0: 45 5f 44 41 54 45 20 20 20 20 30 78 37 32 0a 0a  E_DATE    0x72..
11c0: 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73 20 2a  /** Applet IDs *
11d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
11e0: 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20 20 20  _AID_CCC        
11f0: 20 20 20 20 20 20 20 20 20 30 78 41 30 2c 20 30           0xA0, 0
1200: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 31 2c  x00, 0x00, 0x01,
1210: 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30 78 30   0x16, 0xDB, 0x0
1220: 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  0..#ifdef CACKEY
1230: 5f 44 45 42 55 47 0a 23 20 20 69 66 64 65 66 20  _DEBUG.#  ifdef 
1240: 48 41 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20  HAVE_STDIO_H.#  
1250: 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f    include <stdio
1260: 2e 68 3e 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20  .h>.#  endif..# 
1270: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
1280: 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e  EBUG_PRINTF(x...
1290: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65  ) { fprintf(stde
12a0: 72 72 2c 20 22 25 73 28 29 3a 20 22 2c 20 5f 5f  rr, "%s(): ", __
12b0: 66 75 6e 63 5f 5f 29 3b 20 66 70 72 69 6e 74 66  func__); fprintf
12c0: 28 73 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72  (stderr, x); fpr
12d0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e  intf(stderr, "\n
12e0: 22 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20  "); }.#  define 
12f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1300: 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 7b  NTBUF(f, x, y) {
1310: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1320: 54 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65 64  TMPBUF; unsigned
1330: 20 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42 55   long idx; TMPBU
1340: 46 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  F = (unsigned ch
1350: 61 72 20 2a 29 20 28 78 29 3b 20 66 70 72 69 6e  ar *) (x); fprin
1360: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
1370: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1380: 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63 5f 5f  {%02x", __func__
1390: 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e  , f, #x, (unsign
13a0: 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54 4d  ed long) (y), TM
13b0: 50 42 55 46 5b 30 5d 29 3b 20 66 6f 72 20 28 69  PBUF[0]); for (i
13c0: 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 79  dx = 1; idx < (y
13d0: 29 3b 20 69 64 78 2b 2b 29 20 7b 20 66 70 72 69  ); idx++) { fpri
13e0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2c 20 25  ntf(stderr, ", %
13f0: 30 32 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78  02x", TMPBUF[idx
1400: 5d 29 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28 73  ]); }; fprintf(s
1410: 74 64 65 72 72 2c 20 22 7d 29 5c 6e 22 29 3b 20  tderr, "})\n"); 
1420: 7d 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  }.#  define CACK
1430: 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28  EY_DEBUG_PERROR(
1440: 78 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64  x) { fprintf(std
1450: 65 72 72 2c 20 22 25 73 28 29 3a 20 22 2c 20 5f  err, "%s(): ", _
1460: 5f 66 75 6e 63 5f 5f 29 3b 20 70 65 72 72 6f 72  _func__); perror
1470: 28 78 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65  (x); }.#  define
1480: 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45   free(x) { CACKE
1490: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14a0: 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c 20  FREE(%p) (%s)", 
14b0: 78 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b  x, #x); free(x);
14c0: 20 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20   }..static void 
14d0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
14e0: 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74  NC_MALLOC(size_t
14f0: 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61   size, const cha
1500: 72 20 2a 66 75 6e 63 29 20 7b 0a 09 76 6f 69 64  r *func) {..void
1510: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
1520: 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  al = malloc(size
1530: 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28 73 74 64  );...fprintf(std
1540: 65 72 72 2c 20 22 25 73 28 29 3a 20 22 2c 20 66  err, "%s(): ", f
1550: 75 6e 63 29 3b 0a 09 66 70 72 69 6e 74 66 28 73  unc);..fprintf(s
1560: 74 64 65 72 72 2c 20 22 4d 41 4c 4c 4f 43 28 29  tderr, "MALLOC()
1570: 20 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b   = %p", retval);
1580: 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
1590: 2c 20 22 5c 6e 22 29 3b 0a 0a 09 72 65 74 75 72  , "\n");...retur
15a0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
15b0: 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45  atic void *CACKE
15c0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
15d0: 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c 20  LLOC(void *ptr, 
15e0: 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e  size_t size, con
15f0: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 29 20 7b  st char *func) {
1600: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a  ..void *retval;.
1610: 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
1620: 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a  oc(ptr, size);..
1630: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 70  .if (retval != p
1640: 74 72 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  tr) {...fprintf(
1650: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 20 22  stderr, "%s(): "
1660: 2c 20 66 75 6e 63 29 3b 0a 09 09 66 70 72 69 6e  , func);...fprin
1670: 74 66 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c  tf(stderr, "REAL
1680: 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70  LOC(%p) = %p", p
1690: 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66  tr, retval);...f
16a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
16b0: 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  \n");..}...retur
16c0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
16d0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
16e0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
16f0: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e  NC_TAG_TO_STR(un
1700: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 29  signed char tag)
1710: 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61 67 29   {..switch (tag)
1720: 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f   {...case GSCIS_
1730: 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09 09 72  TAG_CARDID:....r
1740: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1750: 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63 61 73  _CARDID");...cas
1760: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
1770: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
1780: 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45  GSCIS_TAG_CCC_VE
1790: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
17a0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09  S_TAG_CCG_VER:..
17b0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
17c0: 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09  TAG_CCG_VER");..
17d0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
17e0: 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65 74 75  CARDURL:....retu
17f0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
1800: 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73 65 20  RDURL");...case 
1810: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
1820: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1830: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22 29 3b  IS_TAG_PKCS15");
1840: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1850: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c  G_REG_DATA_MODEL
1860: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1870: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
1880: 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  MODEL");...case 
1890: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
18a0: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
18b0: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
18c0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  BLE");...case GS
18d0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
18e0: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
18f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
1900: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
1910: 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f  S_TAG_REDIRECTIO
1920: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  N:....return("GS
1930: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
1940: 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ION");...case GS
1950: 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72  CIS_TAG_CT:....r
1960: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1970: 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _CT");...case GS
1980: 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72  CIS_TAG_ST:....r
1990: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
19a0: 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _ST");...case GS
19b0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a  CIS_TAG_NEXTCCC:
19c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
19d0: 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22 29 3b  S_TAG_NEXTCCC");
19e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
19f0: 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_FNAME:....retu
1a00: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 46 4e  rn("GSCIS_TAG_FN
1a10: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
1a20: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09  CIS_TAG_MNAME:..
1a30: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1a40: 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_MNAME");...c
1a50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e  ase GSCIS_TAG_LN
1a60: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
1a70: 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22  GSCIS_TAG_LNAME"
1a80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1a90: 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09 09 72  TAG_SUFFIX:....r
1aa0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1ab0: 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63 61 73  _SUFFIX");...cas
1ac0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54  e GSCIS_TAG_GOVT
1ad0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
1ae0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 4f  rn("GSCIS_TAG_GO
1af0: 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  VT_AGENCY");...c
1b00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
1b10: 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72 6e 28  REAU:....return(
1b20: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41  "GSCIS_TAG_BUREA
1b30: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
1b40: 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44  S_TAG_BUREAU_COD
1b50: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1b60: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
1b70: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
1b80: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
1b90: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1ba0: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
1bb0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1bc0: 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09  S_TAG_TITLE:....
1bd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1be0: 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63 61 73  G_TITLE");...cas
1bf0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c  e GSCIS_TAG_BUIL
1c00: 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e 28  DING:....return(
1c10: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44  "GSCIS_TAG_BUILD
1c20: 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ING");...case GS
1c30: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
1c40: 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  DDR1:....return(
1c50: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1c60: 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63 61 73  E_ADDR1");...cas
1c70: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1c80: 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72 65 74  CE_ADDR2:....ret
1c90: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1ca0: 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b 0a 09  FFICE_ADDR2");..
1cb0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1cc0: 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09 09 09  OFFICE_CITY:....
1cd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1ce0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22 29 3b  G_OFFICE_CITY");
1cf0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d00: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 3a 0a  G_OFFICE_STATE:.
1d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1d20: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
1d30: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1d40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50  S_TAG_OFFICE_ZIP
1d50: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1d60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49  IS_TAG_OFFICE_ZI
1d70: 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  P");...case GSCI
1d80: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
1d90: 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  NTRY:....return(
1da0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1db0: 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63  E_COUNTRY");...c
1dc0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
1dd0: 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72  FICE_PHONE:....r
1de0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1df0: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b  _OFFICE_PHONE");
1e00: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1e10: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45  G_OFFICE_PHONE_E
1e20: 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  XT:....return("G
1e30: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
1e40: 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63  PHONE_EXT");...c
1e50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
1e60: 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72 65 74  FICE_FAX:....ret
1e70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1e80: 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09 09 63  FFICE_FAX");...c
1e90: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
1ea0: 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72  FICE_EMAIL:....r
1eb0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1ec0: 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b  _OFFICE_EMAIL");
1ed0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1ee0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09  G_OFFICE_ROOM:..
1ef0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1f00: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22  TAG_OFFICE_ROOM"
1f10: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1f20: 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43  TAG_NONGOV_AGENC
1f30: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
1f40: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
1f50: 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20  GENCY");...case 
1f60: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45  GSCIS_TAG_SSN_DE
1f70: 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74  SIGNATOR:....ret
1f80: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
1f90: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22 29 3b  SN_DESIGNATOR");
1fa0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1fb0: 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e  G_SSN:....return
1fc0: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 22  ("GSCIS_TAG_SSN"
1fd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1fe0: 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75  TAG_DOB:....retu
1ff0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f  rn("GSCIS_TAG_DO
2000: 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  B");...case GSCI
2010: 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09  S_TAG_GENDER:...
2020: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2030: 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09 63  AG_GENDER");...c
2040: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 55 53  ase GSCIS_TAG_US
2050: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2060: 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49  "GSCIS_TAG_USERI
2070: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2080: 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09  S_TAG_DOMAIN:...
2090: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
20a0: 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63  AG_DOMAIN");...c
20b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41  ase GSCIS_TAG_PA
20c0: 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74 75 72  SSWORD:....retur
20d0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 41 53  n("GSCIS_TAG_PAS
20e0: 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73 65 20  SWORD");...case 
20f0: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52  GSCIS_TAG_ISSUER
2100: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2110: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49  SCIS_TAG_ISSUERI
2120: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2130: 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09  S_TAG_SERNO:....
2140: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2150: 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73  G_SERNO");...cas
2160: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2170: 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  E_DATE:....retur
2180: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
2190: 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  UE_DATE");...cas
21a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
21b0: 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  RE_DATE:....retu
21c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 45 58  rn("GSCIS_TAG_EX
21d0: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  PIRE_DATE");...c
21e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
21f0: 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  RD_TYPE:....retu
2200: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2210: 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  RD_TYPE");...cas
2220: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55  e GSCIS_TAG_SECU
2230: 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65  RITY_CODE:....re
2240: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2250: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22 29 3b  SECURITY_CODE");
2260: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2270: 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a 09 09  G_CARDID_AID:...
2280: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2290: 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22 29 3b  AG_CARDID_AID");
22a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
22b0: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
22c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
22d0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 22  TAG_CERTIFICATE"
22e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
22f0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
2300: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2310: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
2320: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
2330: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
2340: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a  RT_EXPIRE_DATE:.
2350: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2360: 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45  _TAG_CERT_EXPIRE
2370: 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  _DATE");..}...re
2380: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
2390: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
23a0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
23b0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
23c0: 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65  R_TO_STR(LONG re
23d0: 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74 63 68  tcode) {..switch
23e0: 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09 09 63   (retcode) {...c
23f0: 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55 43 43  ase SCARD_S_SUCC
2400: 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ESS:....return("
2410: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 22  SCARD_S_SUCCESS"
2420: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2430: 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09  E_CANCELLED:....
2440: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2450: 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63  CANCELLED");...c
2460: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 54  ase SCARD_E_CANT
2470: 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72 65 74  _DISPOSE:....ret
2480: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
2490: 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09 09 63  T_DISPOSE");...c
24a0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 53 55  ase SCARD_E_INSU
24b0: 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 3a  FFICIENT_BUFFER:
24c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
24d0: 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54  D_E_INSUFFICIENT
24e0: 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63 61 73  _BUFFER");...cas
24f0: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
2500: 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75 72 6e  D_ATR:....return
2510: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  ("SCARD_E_INVALI
2520: 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73 65 20  D_ATR");...case 
2530: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2540: 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75 72  HANDLE:....retur
2550: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
2560: 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63  ID_HANDLE");...c
2570: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
2580: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09  LID_PARAMETER:..
2590: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
25a0: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
25b0: 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TER");...case SC
25c0: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
25d0: 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  RGET:....return(
25e0: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
25f0: 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63 61 73  _TARGET");...cas
2600: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
2610: 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75  D_VALUE:....retu
2620: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
2630: 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63  LID_VALUE");...c
2640: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  ase SCARD_E_NO_M
2650: 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75 72 6e  EMORY:....return
2660: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d  ("SCARD_E_NO_MEM
2670: 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ORY");...case SC
2680: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
2690: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
26a0: 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e  "SCARD_E_UNKNOWN
26b0: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
26c0: 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  e SCARD_E_TIMEOU
26d0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
26e0: 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b  ARD_E_TIMEOUT");
26f0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2700: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
2710: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  N:....return("SC
2720: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
2730: 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  OLATION");...cas
2740: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41  e SCARD_E_NO_SMA
2750: 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  RTCARD:....retur
2760: 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d  n("SCARD_E_NO_SM
2770: 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ARTCARD");...cas
2780: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
2790: 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  N_CARD:....retur
27a0: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
27b0: 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  WN_CARD");...cas
27c0: 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  e SCARD_E_PROTO_
27d0: 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72 65 74  MISMATCH:....ret
27e0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 52 4f  urn("SCARD_E_PRO
27f0: 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09  TO_MISMATCH");..
2800: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
2810: 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65 74 75  T_READY:....retu
2820: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f  rn("SCARD_E_NOT_
2830: 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73 65 20  READY");...case 
2840: 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43  SCARD_E_SYSTEM_C
2850: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
2860: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 59 53  urn("SCARD_E_SYS
2870: 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  TEM_CANCELLED");
2880: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2890: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a  NOT_TRANSACTED:.
28a0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
28b0: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45  _E_NOT_TRANSACTE
28c0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
28d0: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41  D_E_READER_UNAVA
28e0: 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  ILABLE:....retur
28f0: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
2900: 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b  R_UNAVAILABLE");
2910: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
2920: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44  UNSUPPORTED_CARD
2930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2940: 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_W_UNSUPPORTED
2950: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2960: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
2970: 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09 72 65  SIVE_CARD:....re
2980: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
2990: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 22  RESPONSIVE_CARD"
29a0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
29b0: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
29c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
29d0: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
29e0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
29f0: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
2a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2a10: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 22  RD_W_RESET_CARD"
2a20: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2a30: 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a  W_REMOVED_CARD:.
2a40: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2a50: 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 22  _W_REMOVED_CARD"
2a60: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2a70: 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a  E_PCI_TOO_SMALL:
2a80: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2a90: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
2aa0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  L");...case SCAR
2ab0: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50  D_E_READER_UNSUP
2ac0: 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72  PORTED:....retur
2ad0: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
2ae0: 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  R_UNSUPPORTED");
2af0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2b00: 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52  DUPLICATE_READER
2b10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2b20: 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52  RD_E_DUPLICATE_R
2b30: 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20  EADER");...case 
2b40: 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53  SCARD_E_CARD_UNS
2b50: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
2b60: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 52  urn("SCARD_E_CAR
2b70: 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  D_UNSUPPORTED");
2b80: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2b90: 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09 09 72  NO_SERVICE:....r
2ba0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
2bb0: 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09 09 63  O_SERVICE");...c
2bc0: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45 52 56  ase SCARD_E_SERV
2bd0: 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09  ICE_STOPPED:....
2be0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2bf0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 22  SERVICE_STOPPED"
2c00: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2c10: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a  W_INSERTED_CARD:
2c20: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2c30: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52  D_W_INSERTED_CAR
2c40: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2c50: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_E_UNSUPPORTED_
2c60: 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75  FEATURE:....retu
2c70: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55  rn("SCARD_E_UNSU
2c80: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22  PPORTED_FEATURE"
2c90: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22  );..}...return("
2ca0: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
2cb0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2cc0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
2cd0: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
2ce0: 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29 20  uint16_t objid) 
2cf0: 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69 64  {..switch (objid
2d00: 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30 30  ) {...case 0x200
2d10: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
2d20: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47  CKEY_TLV_OBJID_G
2d30: 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09  ENERALINFO");...
2d40: 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09 09  case 0x2100:....
2d50: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
2d60: 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53  LV_OBJID_PROPERS
2d70: 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61  ONALINFO");...ca
2d80: 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72 65  se 0x3000:....re
2d90: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
2da0: 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e  _OBJID_ACCESSCON
2db0: 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20 30  TROL");...case 0
2dc0: 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x4000:....return
2dd0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
2de0: 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61  ID_LOGIN");...ca
2df0: 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72 65  se 0x5000:....re
2e00: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
2e10: 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22  _OBJID_CARDINFO"
2e20: 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30 30  );...case 0x6000
2e30: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
2e40: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49  KEY_TLV_OBJID_BI
2e50: 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63 61  OMETRICS");...ca
2e60: 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72 65  se 0x7000:....re
2e70: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
2e80: 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49  _OBJID_DIGITALSI
2e90: 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65 20  GCERT");...case 
2ea0: 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75 72  0x0200:....retur
2eb0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2ec0: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29  JID_CAC_PERSON")
2ed0: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 32 3a  ;...case 0x0202:
2ee0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2ef0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
2f00: 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63  _BENEFITS");...c
2f10: 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09 72  ase 0x0203:....r
2f20: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
2f30: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45  V_OBJID_CAC_OTHE
2f40: 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63  RBENEFITS");...c
2f50: 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09 72  ase 0x0201:....r
2f60: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
2f70: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
2f80: 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  ONNEL");...case 
2f90: 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75 72  0x02FE:....retur
2fa0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2fb0: 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 22  JID_CAC_PKICERT"
2fc0: 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28  );..}....return(
2fd0: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73  "UNKNOWN");.}..s
2fe0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2ff0: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
3000: 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53  UNC_APPTYPE_TO_S
3010: 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74 79  TR(uint8_t appty
3020: 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61  pe) {..switch (a
3030: 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65  pptype) {...case
3040: 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72 6e   0x00:....return
3050: 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65  ("NONE");...case
3060: 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72 6e   0x01:....return
3070: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3080: 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63 61  _GENERIC");...ca
3090: 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74 75  se 0x02:....retu
30a0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
30b0: 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_SKI");...case
30c0: 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72 6e   0x03:....return
30d0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
30e0: 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45  _GENERIC | CACKE
30f0: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b  Y_TLV_APP_SKI");
3100: 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09 09  ...case 0x04:...
3110: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3120: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
3130: 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09 72  .case 0x05:....r
3140: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3150: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3160: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
3170: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3180: 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  6:....return("CA
3190: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
31a0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
31b0: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_PKI");...case 
31c0: 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x07:....return(
31d0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
31e0: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
31f0: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43  _TLV_APP_SKI | C
3200: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
3210: 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  I");..}...return
3220: 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a  ("INVALID");.}..
3230: 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63  #  define malloc
3240: 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47  (x) CACKEY_DEBUG
3250: 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20  _FUNC_MALLOC(x, 
3260: 5f 5f 66 75 6e 63 5f 5f 29 0a 23 20 20 64 65 66  __func__).#  def
3270: 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79  ine realloc(x, y
3280: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
3290: 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79  UNC_REALLOC(x, y
32a0: 2c 20 5f 5f 66 75 6e 63 5f 5f 29 0a 23 65 6c 73  , __func__).#els
32b0: 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  e.#  define CACK
32c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32d0: 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x...) /**/.#  de
32e0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
32f0: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c  G_PRINTBUF(f, x,
3300: 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69   y) /**/.#  defi
3310: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
3320: 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23  PERROR(x) /**/.#
3330: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
3340: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
3350: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
3360: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
3370: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
3380: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
3390: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
33a0: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
33b0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
33c0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
33d0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
33e0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
33f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
3400: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
3410: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
3420: 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74  BLED".#endif..st
3430: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
3440: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73  _identity {..uns
3450: 69 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65  igned char apple
3460: 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20  t[7];..uint16_t 
3470: 66 69 6c 65 3b 0a 0a 09 75 6e 73 69 67 6e 65 64  file;...unsigned
3480: 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09   char *label;...
3490: 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61  size_t certifica
34a0: 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65  te_len;..unsigne
34b0: 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63  d char *certific
34c0: 61 74 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ate;.};..struct 
34d0: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
34e0: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
34f0: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
3500: 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41  identity;...CK_A
3510: 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69 62  TTRIBUTE *attrib
3520: 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  utes;..CK_ULONG 
3530: 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
3540: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
3550: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69  key_session {..i
3560: 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f  nt active;...CK_
3570: 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
3580: 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65  ..CK_STATE state
3590: 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  ;..CK_FLAGS flag
35a0: 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  s;..CK_ULONG ulD
35b0: 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f  eviceError;..CK_
35c0: 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63  VOID_PTR pApplic
35d0: 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46  ation;..CK_NOTIF
35e0: 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75  Y Notify;...stru
35f0: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
3600: 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a  ty *identities;.
3610: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
3620: 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b  dentities_count;
3630: 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63  ...int search_ac
3640: 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42  tive;..CK_ATTRIB
3650: 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71  UTE_PTR search_q
3660: 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  uery;..CK_ULONG 
3670: 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
3680: 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  nt;..unsigned lo
3690: 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69  ng search_curr_i
36a0: 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63  d;...int sign_ac
36b0: 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e  tive;..CK_MECHAN
36c0: 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65  ISM_TYPE sign_me
36d0: 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54  chanism;..CK_BYT
36e0: 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a  E_PTR sign_buf;.
36f0: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73  .unsigned long s
3700: 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73  ign_buflen;..uns
3710: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f  igned long sign_
3720: 62 75 66 75 73 65 64 3b 0a 0a 09 69 6e 74 20 64  bufused;...int d
3730: 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b 0a 09  ecrypt_active;..
3740: 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50  CK_MECHANISM_TYP
3750: 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e  E decrypt_mechan
3760: 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54  ism;..CK_VOID_PT
3770: 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  R decrypt_mech_p
3780: 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64  arm;..CK_ULONG d
3790: 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
37a0: 6c 65 6e 3b 0a 0a 7d 3b 0a 0a 73 74 72 75 63 74  len;..};..struct
37b0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09   cackey_slot {..
37c0: 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 63 68  int active;...ch
37d0: 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 3b  ar *pcsc_reader;
37e0: 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72 64  ...int pcsc_card
37f0: 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41  _connected;..SCA
3800: 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63 61  RDHANDLE pcsc_ca
3810: 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61  rd;...int transa
3820: 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 7d 3b 0a  ction_depth;.};.
3830: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a  .typedef enum {.
3840: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
3850: 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a  GENERIC = 0x01,.
3860: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
3870: 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a  SKI     = 0x02,.
3880: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
3890: 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d  PKI     = 0x04.}
38a0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74   cackey_tlv_appt
38b0: 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ype;..typedef en
38c0: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56  um {..CACKEY_TLV
38d0: 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e  _OBJID_GENERALIN
38e0: 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30  FO       = 0x200
38f0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
3900: 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c  BJID_PROPERSONAL
3910: 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c  INFO   = 0x2100,
3920: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3930: 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c  ID_ACCESSCONTROL
3940: 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09       = 0x3000,..
3950: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3960: 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20  _LOGIN          
3970: 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41     = 0x4000,..CA
3980: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
3990: 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20  ARDINFO         
39a0: 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b   = 0x5000,..CACK
39b0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f  EY_TLV_OBJID_BIO
39c0: 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d  METRICS        =
39d0: 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x6000,..CACKEY
39e0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54  _TLV_OBJID_DIGIT
39f0: 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30  ALSIGCERT    = 0
3a00: 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x7000,..CACKEY_T
3a10: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3a20: 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30  SON        = 0x0
3a30: 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  200,..CACKEY_TLV
3a40: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46  _OBJID_CAC_BENEF
3a50: 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30  ITS      = 0x020
3a60: 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  2,..CACKEY_TLV_O
3a70: 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45  BJID_CAC_OTHERBE
3a80: 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c  NEFITS = 0x0203,
3a90: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3aa0: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c  ID_CAC_PERSONNEL
3ab0: 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09       = 0x0201,..
3ac0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3ad0: 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20  _CAC_PKICERT    
3ae0: 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61     = 0x02FE.} ca
3af0: 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69  ckey_tlv_objecti
3b00: 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  d;..typedef enum
3b10: 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f   {..CACKEY_PCSC_
3b20: 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20  S_TOKENPRESENT  
3b30: 20 20 3d 20 32 2c 0a 09 43 41 43 4b 45 59 5f 50    = 2,..CACKEY_P
3b40: 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_S_TOKENABSEN
3b50: 54 20 20 20 20 20 3d 20 31 2c 0a 09 43 41 43 4b  T     = 1,..CACK
3b60: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
3b70: 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a 09            = 0,..
3b80: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
3b90: 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d 20  NERIC         = 
3ba0: 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -1,..CACKEY_PCSC
3bb0: 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20 20  _E_BADPIN       
3bc0: 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45 59     = -2,..CACKEY
3bd0: 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20 20  _PCSC_E_LOCKED  
3be0: 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 7d 20          = -3,.} 
3bf0: 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72  cackey_ret;..str
3c00: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63  uct cackey_tlv_c
3c10: 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e  ardurl {..unsign
3c20: 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72  ed char        r
3c30: 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74  id[5];..cackey_t
3c40: 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70  lv_apptype   app
3c50: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  type;..cackey_tl
3c60: 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65  v_objectid  obje
3c70: 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  ctid;..cackey_tl
3c80: 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69  v_objectid  appi
3c90: 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  d;..unsigned cha
3ca0: 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a  r        pinid;.
3cb0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
3cc0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74  y_tlv_entity;.st
3cd0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
3ce0: 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f  entity {..uint8_
3cf0: 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  t tag;..size_t l
3d00: 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b  ength;...union {
3d10: 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a  ...void *value;.
3d20: 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
3d30: 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c  tlv_cardurl *val
3d40: 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69  ue_cardurl;...ui
3d50: 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65  nt8_t value_byte
3d60: 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63  ;..};...struct c
3d70: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
3d80: 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20   *_next;.};../* 
3d90: 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61  CACKEY Global Ha
3da0: 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ndles */.static 
3db0: 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67  void *cackey_big
3dc0: 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  lock = NULL;.sta
3dd0: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
3de0: 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79  y_session cackey
3df0: 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a  _sessions[128];.
3e00: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
3e10: 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79  ckey_slot cackey
3e20: 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61  _slots[128];.sta
3e30: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69  tic int cackey_i
3e40: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
3e50: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
3e60: 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
3e70: 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   0;.CK_C_INITIAL
3e80: 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f  IZE_ARGS cackey_
3e90: 61 72 67 73 3b 0a 0a 2f 2a 20 50 43 53 43 20 47  args;../* PCSC G
3ea0: 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f  lobal Handles */
3eb0: 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52 44 43  .static LPSCARDC
3ec0: 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f 70 63  ONTEXT cackey_pc
3ed0: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c  sc_handle = NULL
3ee0: 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  ;..static unsign
3ef0: 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67  ed long cackey_g
3f00: 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 20  etversion(void) 
3f10: 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69 67 6e  {..static unsign
3f20: 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d  ed long retval =
3f30: 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20   255;..unsigned 
3f40: 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a  long major = 0;.
3f50: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d  .unsigned long m
3f60: 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72 20  inor = 0;..char 
3f70: 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c  *major_str = NUL
3f80: 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f  L;..char *minor_
3f90: 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41  str = NULL;...CA
3fa0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
3fb0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
3fc0: 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 32 35  if (retval != 25
3fd0: 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  5) {...CACKEY_DE
3fe0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
3ff0: 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63 61 63  rning 0x%lx (cac
4000: 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b  hed).", retval);
4010: 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74 76 61  ....return(retva
4020: 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20  l);..}...retval 
4030: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50 41 43  = 0;..#ifdef PAC
4040: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20  KAGE_VERSION.   
4050: 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d       major_str =
4060: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
4070: 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72  ;..if (major_str
4080: 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d 61 6a  ) {..        maj
4090: 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a  or = strtoul(maj
40a0: 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73  or_str, &minor_s
40b0: 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20 28  tr, 10);....if (
40c0: 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09  minor_str) {....
40d0: 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28  minor = strtoul(
40e0: 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e  minor_str + 1, N
40f0: 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d  ULL, 10);...}..}
4100: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a  ...retval = (maj
4110: 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e  or << 16) | (min
4120: 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66  or << 8);.#endif
4130: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4140: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
4150: 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76 61 6c  g 0x%lx", retval
4160: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
4170: 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43  al);.}../* PC/SC
4180: 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f   Related Functio
4190: 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50  ns */./*. * SYNP
41a0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
41b0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69   cackey_slots_di
41c0: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69  sconnect_all(voi
41d0: 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  d);. *. * ARGUME
41e0: 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  NTS. *     None.
41f0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
4200: 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  UE. *     None. 
4210: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
4220: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
4230: 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d  disconnects from
4240: 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a 0a 20   all cards.. *. 
4250: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
4260: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
4270: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29  onnect_all(void)
4280: 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
4290: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
42a0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
42b0: 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ");...for (idx =
42c0: 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
42d0: 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
42e0: 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
42f0: 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b  slots[0])); idx+
4300: 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
4310: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
4320: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
4330: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
4340: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
4350: 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29  dDisconnect(%lu)
4360: 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67   called", (unsig
4370: 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a  ned long) idx);.
4380: 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  ....SCardDisconn
4390: 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ect(cackey_slots
43a0: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c  [idx].pcsc_card,
43b0: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
43c0: 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  D);...}....cacke
43d0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
43e0: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
43f0: 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
4400: 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
4410: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
4420: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
4430: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
4440: 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e  ning");...return
4450: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
4460: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
4470: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73  y_ret cackey_pcs
4480: 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b  c_connect(void);
4490: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
44a0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
44b0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
44c0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
44d0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
44e0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
44f0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
4500: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
4510: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
4520: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
4530: 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f  tion connects to
4540: 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65   the PC/SC Conne
4550: 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e  ction Manager an
4560: 64 20 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a  d updates the. *
4570: 20 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64       global hand
4580: 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  le.. *. */.stati
4590: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
45a0: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
45b0: 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73  (void) {..LONG s
45c0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
45d0: 5f 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56  _ret;.#ifdef HAV
45e0: 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f  E_SCARDISVALIDCO
45f0: 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72  NTEXT..LONG scar
4600: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23  d_isvalid_ret;.#
4610: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
4620: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
4630: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61  led.");...if (ca
4640: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4650: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   == NULL) {...ca
4660: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4670: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
4680: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
4690: 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61  ndle));...if (ca
46a0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
46b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43   == NULL) {....C
46c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
46d0: 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c  TF("Call to mall
46e0: 6f 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74  oc() failed, ret
46f0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
4700: 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  e");.....cackey_
4710: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
4720: 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75  _all();.....retu
4730: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
4740: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a  _GENERIC);...}..
4750: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4760: 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61  RINTF("SCardEsta
4770: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63  blishContext() c
4780: 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64  alled");...scard
4790: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
47a0: 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73   = SCardEstablis
47b0: 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53  hContext(SCARD_S
47c0: 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c  COPE_SYSTEM, NUL
47d0: 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f  L, NULL, cackey_
47e0: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
47f0: 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  if (scard_est_co
4800: 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41  ntext_ret != SCA
4810: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
4820: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4830: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20  PRINTF("Call to 
4840: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
4850: 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65  ntext failed (re
4860: 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20  turned %s/%li), 
4870: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
4880: 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45  lure", CACKEY_DE
4890: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
48a0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65  R_TO_STR(scard_e
48b0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c  st_context_ret),
48c0: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73   (long) scard_es
48d0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a  t_context_ret);.
48e0: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
48f0: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09  pcsc_handle);...
4900: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
4910: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
4920: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
4930: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
4940: 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  C);...}..}..#ifd
4950: 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56  ef HAVE_SCARDISV
4960: 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 41 43  ALIDCONTEXT..CAC
4970: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
4980: 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f  ("SCardIsValidCo
4990: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29  ntext() called")
49a0: 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c 69 64  ;..scard_isvalid
49b0: 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 56 61  _ret = SCardIsVa
49c0: 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b  lidContext(*cack
49d0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
49e0: 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 76 61  ..if (scard_isva
49f0: 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 52 44  lid_ret != SCARD
4a00: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
4a10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4a20: 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20  NTF("Handle has 
4a30: 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28  become invalid (
4a40: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74  SCardIsValidCont
4a50: 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74  ext = %s/%li), t
4a60: 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 74 61  rying to re-esta
4a70: 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45  blish...", CACKE
4a80: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
4a90: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
4aa0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 2c  rd_isvalid_ret),
4ab0: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69 73   (long) scard_is
4ac0: 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43  valid_ret);....C
4ad0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4ae0: 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69  TF("SCardEstabli
4af0: 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  shContext() call
4b00: 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73  ed");...scard_es
4b10: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20  t_context_ret = 
4b20: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
4b30: 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50  ntext(SCARD_SCOP
4b40: 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20  E_SYSTEM, NULL, 
4b50: 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73  NULL, cackey_pcs
4b60: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20  c_handle);...if 
4b70: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
4b80: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  xt_ret != SCARD_
4b90: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
4ba0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4bb0: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61  NTF("Call to SCa
4bc0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
4bd0: 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72  xt failed (retur
4be0: 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74  ned %s/%li), ret
4bf0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
4c00: 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  e", CACKEY_DEBUG
4c10: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
4c20: 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f  O_STR(scard_est_
4c30: 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c  context_ret), (l
4c40: 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63  ong) scard_est_c
4c50: 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09  ontext_ret);....
4c60: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
4c70: 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 09 09 63  c_handle);.....c
4c80: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
4c90: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
4ca0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
4cb0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
4cc0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
4cd0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e  EBUG_PRINTF("Han
4ce0: 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d  dle has been re-
4cf0: 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09  established");..
4d00: 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  }.#endif...CACKE
4d10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4d20: 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e  Sucessfully conn
4d30: 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20  ected to PC/SC, 
4d40: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  returning in suc
4d50: 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e  cess");...return
4d60: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
4d70: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
4d80: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
4d90: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
4da0: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
4db0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
4dc0: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
4dd0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
4de0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
4df0: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
4e00: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
4e10: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
4e20: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
4e30: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
4e40: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
4e50: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
4e60: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
4e70: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
4e80: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
4e90: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
4ea0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
4eb0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
4ec0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
4ed0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
4ee0: 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e  key_ret pcsc_con
4ef0: 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44  nect_ret;..DWORD
4f00: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47   protocol;..LONG
4f10: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
4f20: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4f30: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
4f40: 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20  );...if (!slot) 
4f50: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
4f60: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
4f70: 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2c   slot specified,
4f80: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
4f90: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
4fa0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
4fb0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
4fc0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
4fd0: 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63   = cackey_pcsc_c
4fe0: 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70  onnect();..if (p
4ff0: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
5000: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
5010: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
5020: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
5030: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53  nnection to PC/S
5040: 43 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  C failed, return
5050: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
5060: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
5070: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
5080: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e  C);..}.../* Conn
5090: 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20 69  ect to reader, i
50a0: 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66 20  f needed */..if 
50b0: 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  (!slot->pcsc_car
50c0: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
50d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
50e0: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
50f0: 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c 20  ct(%s) called", 
5100: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
5110: 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e  r);...scard_conn
5120: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
5130: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
5140: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
5150: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
5160: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
5170: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
5180: 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  0, &slot->pcsc_c
5190: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
51a0: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
51b0: 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  nn_ret != SCARD_
51c0: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
51d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
51e0: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
51f0: 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c 20  to card failed, 
5200: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
5210: 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e 65  lure (SCardConne
5220: 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c  ct() = %s/%li)",
5230: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
5240: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
5250: 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  TR(scard_conn_re
5260: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
5270: 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09  _conn_ret);.....
5280: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5290: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
52a0: 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63  .}....slot->pcsc
52b0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
52c0: 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 1;...slot->tra
52d0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
52e0: 20 30 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28   0;..}...return(
52f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
5300: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
5310: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
5320: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
5330: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
5340: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5350: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
5360: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
5370: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
5380: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
5390: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
53a0: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
53b0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
53c0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
53d0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
53e0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
53f0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5400: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
5410: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
5420: 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f    The transactio
5430: 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65 72 6d  n should be term
5440: 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22 63 61  inated using "ca
5450: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
5460: 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  tion". *. */.sta
5470: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
5480: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
5490: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
54a0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
54b0: 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ) {..cackey_ret 
54c0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b  cackey_conn_ret;
54d0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61  ..LONG scard_tra
54e0: 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ns_ret;...CACKEY
54f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
5500: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61 63 6b  alled.");...cack
5510: 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  ey_conn_ret = ca
5520: 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
5530: 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 63 61  d(slot);..if (ca
5540: 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d  ckey_conn_ret !=
5550: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
5560: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
5570: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
5580: 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
5590: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
55a0: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
55b0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
55c0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
55d0: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  }...slot->transa
55e0: 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a  ction_depth++;..
55f0: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
5600: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 31  action_depth > 1
5610: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
5620: 55 47 5f 50 52 49 4e 54 46 28 22 41 6c 72 65 61  UG_PRINTF("Alrea
5630: 64 79 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74  dy in a transact
5640: 69 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20  ion, performing 
5650: 6e 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77 20 64  no action (new d
5660: 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f  epth = %i)", slo
5670: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
5680: 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e  epth);....return
5690: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
56a0: 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74  K);..}...scard_t
56b0: 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64  rans_ret = SCard
56c0: 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
56d0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
56e0: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72  );..if (scard_tr
56f0: 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ans_ret != SCARD
5700: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
5710: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5720: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62  NTF("Unable to b
5730: 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
5740: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
5750: 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  rror");....retur
5760: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
5770: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
5780: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5790: 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20  TF("Sucessfully 
57a0: 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f  began transactio
57b0: 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c  n on slot (%s)",
57c0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
57d0: 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  er);...return(CA
57e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
57f0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
5800: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
5810: 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f  _ret cackey_end_
5820: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
5830: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
5840: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
5850: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
5860: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
5870: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
5880: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
5890: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
58a0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
58b0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
58c0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
58d0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
58e0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
58f0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
5900: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
5910: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75  is function requ
5920: 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67  ires "cackey_beg
5930: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20  in_transaction" 
5940: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  to be called fir
5950: 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  st. *. */.static
5960: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5970: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
5980: 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  on(struct cackey
5990: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
59a0: 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73  LONG scard_trans
59b0: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
59c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
59d0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
59e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
59f0: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41  onnected) {...CA
5a00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5a10: 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63  F("Card is not c
5a20: 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65  onnected, unable
5a30: 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74   to end transact
5a40: 69 6f 6e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ion");....return
5a50: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
5a60: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66  ENERIC);..}...if
5a70: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
5a80: 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30 29 20  ion_depth == 0) 
5a90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
5aa0: 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69 6e 61  _PRINTF("Termina
5ab0: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
5ac0: 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
5ad0: 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72 65 74  begun!");....ret
5ae0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
5af0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
5b00: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
5b10: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 66  on_depth--;...if
5b20: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
5b30: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
5b40: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5b50: 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61 63 74  PRINTF("Transact
5b60: 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20 70 72  ions still in pr
5b70: 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65 72 6d  ogress, not term
5b80: 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72 64 20  inating on-card 
5b90: 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72  Transaction (cur
5ba0: 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29  rent depth = %i)
5bb0: 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ", slot->transac
5bc0: 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09  tion_depth);....
5bd0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5be0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
5bf0: 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f  }...scard_trans_
5c00: 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72  ret = SCardEndTr
5c10: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
5c20: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
5c30: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69  _LEAVE_CARD);..i
5c40: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  f (scard_trans_r
5c50: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
5c60: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
5c70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5c80: 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72  Unable to end tr
5c90: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
5ca0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
5cb0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
5cc0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5cd0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
5ce0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
5cf0: 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61  essfully termina
5d00: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
5d10: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
5d20: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
5d30: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
5d40: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
5d50: 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65  ../* APDU Relate
5d60: 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f  d Functions */./
5d70: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
5d80: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
5d90: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
5da0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
5db0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
5dc0: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
5dd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
5de0: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
5df0: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
5e00: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
5e10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c  nsigned char lc,
5e20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5e30: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63  data, unsigned c
5e40: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74  har le, uint16_t
5e50: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69   *respcode, unsi
5e60: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
5e70: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73  ata, size_t *res
5e80: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  pdata_len);. *. 
5e90: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
5ea0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
5eb0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
5ec0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
5ed0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
5ee0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
5ef0: 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20   class. *       
5f00: 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53    APDU Class (GS
5f10: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
5f20: 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53  6 or GSCIS_CLASS
5f30: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
5f40: 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61  . *         usua
5f50: 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20  lly), (CLA). *. 
5f60: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
5f70: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  har instruction.
5f80: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
5f90: 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53  Instruction (INS
5fa0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
5fb0: 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20  gned char p1. * 
5fc0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
5fd0: 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a  ameter 1 (P1). *
5fe0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
5ff0: 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20   char p2. *     
6000: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74      APDU Paramet
6010: 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20  er 2 (P2). *. * 
6020: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
6030: 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20  r lc. *         
6040: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43  APDU Length of C
6050: 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74  ontent (Lc) -- t
6060: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
6070: 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20  h of "data". *  
6080: 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72         parameter
6090: 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20  .  If "data" is 
60a0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
60b0: 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  L, this paramete
60c0: 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20  r will. *       
60d0: 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a    be ignored.. *
60e0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
60f0: 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20   char *data. *  
6100: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
6110: 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64  o buffer to send
6120: 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  .  It should be 
6130: 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e  "Lc" bytes long.
6140: 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20    If. *         
6150: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
6160: 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74  L, "Lc" will not
6170: 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68   be sent, and th
6180: 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62  is buffer will b
6190: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e  e. *         ign
61a0: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
61b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
61c0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
61d0: 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63   Length of Expec
61e0: 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74  tation (Le) -- t
61f0: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
6200: 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20  h of the. *     
6210: 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70      expected rep
6220: 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ly.  If this is 
6230: 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74  specified as 0 t
6240: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a  hen it will not.
6250: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65   *         be se
6260: 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69  nt.. *. *     ui
6270: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
6280: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
6290: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
62a0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
62b0: 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20  ponse code.  If 
62c0: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
62d0: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
62e0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
62f0: 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  se code will be 
6300: 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a  discarded.. *. *
6310: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
6320: 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20  ar *respdata. * 
6330: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f          [OUT] Po
6340: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65  inter to storage
6350: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73   of APDU respons
6360: 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73  e data.  If this
6370: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73   is. *         s
6380: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
6390: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64  , the response d
63a0: 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63  ata will be disc
63b0: 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20  arded.  If. *   
63c0: 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64        the "respd
63d0: 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74  ata_len" paramet
63e0: 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20  er is specified 
63f0: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75  as NULL, this bu
6400: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
6410: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
6420: 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73  ted.. *. *     s
6430: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
6440: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  len. *         [
6450: 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72  IN, OUT] Pointer
6460: 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74   initialing cont
6470: 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20  aining the size 
6480: 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61  of the "respdata
6490: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66  ". *         buf
64a0: 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74  fer.  Before ret
64b0: 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e  urning, the poin
64c0: 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20  ted to value is 
64d0: 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20  updated to the. 
64e0: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
64f0: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
6500: 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  n to the buffer.
6510: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65    If this is spe
6520: 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20  cified as. *    
6530: 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69       NULL, it wi
6540: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
6550: 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61  d, and "respdata
6560: 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  " will be ignore
6570: 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20  d causing. *    
6580: 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73       the respons
6590: 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73  e data to be dis
65a0: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45  carded.. *. * RE
65b0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
65c0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
65d0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
65e0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
65f0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6600: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
6610: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
6620: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
6630: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
6640: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
6650: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61  tion Manager via
6660: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70  . *     cackey_p
6670: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66  csc_connect() if
6680: 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20   needed.. *. *  
6690: 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65     It will conne
66a0: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69  ct to the card i
66b0: 6e 20 74 68 65 20 72 65 61 64 65 72 20 61 74 74  n the reader att
66c0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f  ached to the slo
66d0: 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69 66 69  t. *     specifi
66e0: 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63  ed.  It will rec
66f0: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61  onnect to the ca
6700: 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  rd if the connec
6710: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73  tion. *     goes
6720: 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74   away.. *. */.st
6730: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
6740: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
6750: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
6760: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
6770: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
6780: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
6790: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
67a0: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
67b0: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
67c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c  nsigned char lc,
67d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
67e0: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63  data, unsigned c
67f0: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74  har le, uint16_t
6800: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69   *respcode, unsi
6810: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
6820: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73  ata, size_t *res
6830: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69  pdata_len) {..ui
6840: 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20  nt8_t major_rc, 
6850: 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f  minor_rc;..size_
6860: 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c  t bytes_to_copy,
6870: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65   tmp_respdata_le
6880: 6e 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  n;..DWORD protoc
6890: 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f  ol;..DWORD xmit_
68a0: 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09  len, recv_len;..
68b0: 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f  LONG scard_xmit_
68c0: 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
68d0: 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69  n_ret;..BYTE xmi
68e0: 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63  t_buf[1024], rec
68f0: 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e  v_buf[1024];..in
6900: 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
6910: 65 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70  et, pcsc_getresp
6920: 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  _ret;..int idx;.
6930: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6940: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
6950: 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b  ;...if (!slot) {
6960: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6970: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
6980: 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22  slot specified."
6990: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
69a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
69b0: 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63  IC);..}...pcsc_c
69c0: 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
69d0: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
69e0: 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73  (slot);..if (pcs
69f0: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
6a00: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
6a10: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
6a20: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
6a30: 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
6a40: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
6a50: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
6a60: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6a70: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6a80: 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69  ..}.../* Transmi
6a90: 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d  t */..xmit_len =
6aa0: 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d   0;..xmit_buf[xm
6ab0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73  it_len++] = clas
6ac0: 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  s;..xmit_buf[xmi
6ad0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72  t_len++] = instr
6ae0: 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75  uction;..xmit_bu
6af0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
6b00: 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  p1;..xmit_buf[xm
6b10: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a  it_len++] = p2;.
6b20: 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09 78  .if (data) {...x
6b30: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
6b40: 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 66 6f 72 20  ++] = lc;...for 
6b50: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
6b60: 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09  lc; idx++) {....
6b70: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
6b80: 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d  n++] = data[idx]
6b90: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c  ;...}..}...if (l
6ba0: 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 78  e != 0x00) {...x
6bb0: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
6bc0: 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d 0a 0a 09 2f  ++] = le;..}.../
6bd0: 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72  * Begin Smartcar
6be0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
6bf0: 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  ..cackey_begin_t
6c00: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
6c10: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
6c20: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69  _PRINTBUF("Sendi
6c30: 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f  ng APDU:", xmit_
6c40: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a  buf, xmit_len);.
6c50: 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a  ..recv_len = siz
6c60: 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09  eof(recv_buf);..
6c70: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
6c80: 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73   SCardTransmit(s
6c90: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
6ca0: 53 43 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d  SCARD_PCI_T0, xm
6cb0: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
6cc0: 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 31 2c 20  , SCARD_PCI_T1, 
6cd0: 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f  recv_buf, &recv_
6ce0: 6c 65 6e 29 3b 0a 09 69 66 20 28 73 63 61 72 64  len);..if (scard
6cf0: 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41  _xmit_ret != SCA
6d00: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
6d10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6d20: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
6d30: 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61   send APDU to ca
6d40: 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69  rd (SCardTransmi
6d50: 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20  t() = %s/%lx)", 
6d60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
6d70: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
6d80: 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  R(scard_xmit_ret
6d90: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
6da0: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
6db0: 74 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  t);....slot->tra
6dc0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
6dd0: 20 30 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64   0;....if (scard
6de0: 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41  _xmit_ret == SCA
6df0: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29  RD_W_RESET_CARD)
6e00: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
6e10: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
6e20: 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73   required, pleas
6e30: 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09  e hold...");....
6e40: 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  .scard_reconn_re
6e50: 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t = SCardReconne
6e60: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
6e70: 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  rd, SCARD_SHARE_
6e80: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
6e90: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44  OTOCOL_T0, SCARD
6ea0: 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 70 72  _RESET_CARD, &pr
6eb0: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28  otocol);....if (
6ec0: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
6ed0: 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
6ee0: 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52 65  ESS) {...../* Re
6ef0: 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73  -establish trans
6f00: 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61  action, if it wa
6f10: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09  s present */....
6f20: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
6f30: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
6f40: 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74  ) {......slot->t
6f50: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
6f60: 2d 2d 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f  --;......cackey_
6f70: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
6f80: 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a  n(slot);.....}..
6f90: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6fa0: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73  _PRINTF("Reset s
6fb0: 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 61  uccessful, retra
6fc0: 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 09 09 09  nsmitting");....
6fd0: 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  .scard_xmit_ret 
6fe0: 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  = SCardTransmit(
6ff0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7000: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c 20 78   SCARD_PCI_T0, x
7010: 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65  mit_buf, xmit_le
7020: 6e 2c 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c  n, SCARD_PCI_T0,
7030: 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76   recv_buf, &recv
7040: 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  _len);......if (
7050: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21  scard_xmit_ret !
7060: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
7070: 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  S) {......CACKEY
7080: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
7090: 65 74 72 61 6e 73 6d 69 74 20 66 61 69 6c 65 64  etransmit failed
70a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
70b0: 61 69 6c 75 72 65 20 61 66 74 65 72 20 64 69 73  ailure after dis
70c0: 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65 20 63  connecting the c
70d0: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
70e0: 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43  it = %s/%li)", C
70f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
7100: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
7110: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29  (scard_xmit_ret)
7120: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78  , (long) scard_x
7130: 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09  mit_ret);.......
7140: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
7150: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7160: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
7170: 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70  D);......slot->p
7180: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
7190: 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a  ed = 0;......./*
71a0: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
71b0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
71c0: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
71d0: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
71e0: 09 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  .....cackey_end_
71f0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
7200: 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
7210: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7220: 4e 45 52 49 43 29 3b 0a 09 09 09 09 7d 0a 09 09  NERIC);.....}...
7230: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41  .} else {.....CA
7240: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7250: 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67  F("Disconnecting
7260: 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43   card");......SC
7270: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c  ardDisconnect(sl
7280: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7290: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 29  CARD_RESET_CARD)
72a0: 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  ;.....slot->pcsc
72b0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
72c0: 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64  = 0;....../* End
72d0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
72e0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c  action */.....sl
72f0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
7300: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63  depth = 1;.....c
7310: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
7320: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
7330: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7340: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
7350: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09   in failure");..
7360: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
7370: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
7380: 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20  ;....}...} else 
7390: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
73a0: 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e  G_PRINTF("Discon
73b0: 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a  necting card");.
73c0: 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  ....SCardDisconn
73d0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
73e0: 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45 54  ard, SCARD_RESET
73f0: 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d  _CARD);....slot-
7400: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
7410: 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a  cted = 0;...../*
7420: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
7430: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
7440: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
7450: 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09  on_depth = 1;...
7460: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
7470: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
7480: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7490: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
74a0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
74b0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
74c0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
74d0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  ;...}..}...CACKE
74e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
74f0: 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 65  ("Returned Value
7500: 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 65  :", recv_buf, re
7510: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72  cv_len);...if (r
7520: 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09  ecv_len < 2) {..
7530: 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70  ./* Minimal resp
7540: 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 32  onse length is 2
7550: 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 6e   bytes, returnin
7560: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a  g in failure */.
7570: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7580: 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20  RINTF("Response 
7590: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72  too small, retur
75a0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
75b0: 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29  (recv_len = %lu)
75c0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
75d0: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  g) recv_len);...
75e0: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
75f0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
7600: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
7610: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
7620: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
7630: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
7640: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
7650: 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65  mine result code
7660: 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20   */..major_rc = 
7670: 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65  recv_buf[recv_le
7680: 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72  n - 2];..minor_r
7690: 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63  c = recv_buf[rec
76a0: 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20  v_len - 1];..if 
76b0: 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a  (respcode) {...*
76c0: 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f  respcode = (majo
76d0: 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e  r_rc << 8) | min
76e0: 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41  or_rc;..}.../* A
76f0: 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 75  djust message bu
7700: 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65  ffer */..recv_le
7710: 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64  n -= 2;.../* Add
7720: 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e   bytes to return
7730: 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72   value */..tmp_r
7740: 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b  espdata_len = 0;
7750: 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20 26  ..if (respdata &
7760: 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20  & respdata_len) 
7770: 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61  {...tmp_respdata
7780: 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61  _len = *respdata
7790: 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74  _len;....bytes_t
77a0: 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61  o_copy = *respda
77b0: 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72  ta_len;....if (r
77c0: 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f  ecv_len < bytes_
77d0: 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79  to_copy) {....by
77e0: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65  tes_to_copy = re
77f0: 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43  cv_len;...}....C
7800: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7810: 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20  TF("Copying %lu 
7820: 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 66  bytes to the buf
7830: 66 65 72 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  fer", (unsigned 
7840: 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63  long) bytes_to_c
7850: 6f 70 79 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28  opy);....memcpy(
7860: 72 65 73 70 64 61 74 61 2c 20 72 65 63 76 5f 62  respdata, recv_b
7870: 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  uf, bytes_to_cop
7880: 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61 20 2b  y);...respdata +
7890: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
78a0: 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65  ....*respdata_le
78b0: 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  n = bytes_to_cop
78c0: 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74  y;...tmp_respdat
78d0: 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74  a_len -= bytes_t
78e0: 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20  o_copy;..} else 
78f0: 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e  {...if (recv_len
7900: 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
7910: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7920: 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79 20 25  "Throwing away %
7930: 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68 65 72  lu bytes, nowher
7940: 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21 22 2c  e to put them!",
7950: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
7960: 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a   recv_len);...}.
7970: 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72  .}...if (major_r
7980: 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f  c == 0x61) {.../
7990: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52 45 41  * We need to REA
79a0: 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  D */...CACKEY_DE
79b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66  BUG_PRINTF("Buff
79c0: 65 72 20 72 65 61 64 20 72 65 71 75 69 72 65 64  er read required
79d0: 22 29 3b 0a 0a 09 09 70 63 73 63 5f 67 65 74 72  ");....pcsc_getr
79e0: 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  esp_ret = cackey
79f0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
7a00: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
7a10: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
7a20: 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20  R_GET_RESPONSE, 
7a30: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e  0x00, 0x00, 0, N
7a40: 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72  ULL, minor_rc, r
7a50: 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61 74  espcode, respdat
7a60: 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74 61  a, &tmp_respdata
7a70: 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 70 63 73  _len);...if (pcs
7a80: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 21 3d  c_getresp_ret !=
7a90: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
7aa0: 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  K) {....CACKEY_D
7ab0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66  EBUG_PRINTF("Buf
7ac0: 66 65 72 20 72 65 61 64 20 66 61 69 6c 65 64 21  fer read failed!
7ad0: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66    Returning in f
7ae0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a  ailure");...../*
7af0: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
7b00: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
7b10: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
7b20: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
7b30: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
7b40: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
7b50: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73  ;...}....if (res
7b60: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09  pdata_len) {....
7b70: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d  *respdata_len +=
7b80: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65   tmp_respdata_le
7b90: 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64  n;...}..../* End
7ba0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
7bb0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
7bc0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
7bd0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43  on(slot);....CAC
7be0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7bf0: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
7c00: 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72  uccess (buffer r
7c10: 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b  ead complete)");
7c20: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
7c30: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
7c40: 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
7c50: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
7c60: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
7c70: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
7c80: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20  ...if (major_rc 
7c90: 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20  == 0x90) {.../* 
7ca0: 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43  Success */...CAC
7cb0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7cc0: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
7cd0: 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63  uccess (major_rc
7ce0: 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72   = 0x90)");....r
7cf0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
7d00: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43  C_S_OK);..}....C
7d10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7d20: 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e 65  TF("APDU Returne
7d30: 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75  d an error, retu
7d40: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
7d50: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
7d60: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7d70: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  IC);.}../*. * SY
7d80: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73  NPOSIS. *     ss
7d90: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61  ize_t cackey_rea
7da0: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20  d_buffer(struct 
7db0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
7dc0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
7dd0: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
7de0: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64   count, unsigned
7df0: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69   char t_or_v, si
7e00: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
7e10: 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  set);. *. * ARGU
7e20: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
7e30: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7e40: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
7e50: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
7e60: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
7e70: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
7e80: 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20  r *buffer. *    
7e90: 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65       [OUT] Buffe
7ea0: 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65  r. *. *     size
7eb0: 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20  _t count. *     
7ec0: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79      Number of by
7ed0: 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74  tes to attempt t
7ee0: 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20  o read. *. *    
7ef0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
7f00: 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20  _or_v. *        
7f10: 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75   Select the T-bu
7f20: 66 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62  ffer (01) or V-b
7f30: 75 66 66 65 72 20 28 30 32 29 20 74 6f 20 72 65  uffer (02) to re
7f40: 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a  ad from.  . *. *
7f50: 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74       size_t init
7f60: 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20  ial_offset. *   
7f70: 20 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68        Specify th
7f80: 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69  e offset to begi
7f90: 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a  n the read from.
7fa0: 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20   *. *. * RETURN 
7fb0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69  VALUE. *     Thi
7fc0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
7fd0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
7fe0: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
7ff0: 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65  read, or -1 on e
8000: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45  rror.. *. * NOTE
8010: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
8020: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a  . */.static ssiz
8030: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  e_t cackey_read_
8040: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61  buffer(struct ca
8050: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
8060: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8070: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63  buffer, size_t c
8080: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  ount, unsigned c
8090: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65  har t_or_v, size
80a0: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
80b0: 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 6f 66 66  t) {..size_t off
80c0: 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66  set = 0, max_off
80d0: 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a  set, max_count;.
80e0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
80f0: 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74  md[2];..uint16_t
8100: 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20   respcode;..int 
8110: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  send_ret;...CACK
8120: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8130: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 6d 61  "Called.");...ma
8140: 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e 74  x_offset = count
8150: 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 32  ;..max_count = 2
8160: 35 32 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76  52;...if (t_or_v
8170: 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20   != 1 && t_or_v 
8180: 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 2) {...CACKEY
8190: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
81a0: 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61  nvalid T or V pa
81b0: 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
81c0: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
81d0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
81e0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63  turn(-1);..}...c
81f0: 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a  md[0] = t_or_v;.
8200: 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09  ..while (1) {...
8210: 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61  if (offset >= ma
8220: 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43  x_offset) {....C
8230: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8240: 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73  TF("Buffer too s
8250: 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20  mall, returning 
8260: 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29  what we got...")
8270: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
8280: 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  ....count = max_
8290: 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b  offset - offset;
82a0: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d  ...if (count > m
82b0: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63  ax_count) {....c
82c0: 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74  ount = max_count
82d0: 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20  ;...}....cmd[1] 
82e0: 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64  = count;....send
82f0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
8300: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
8310: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
8320: 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53  _PLATFORM, GSCIS
8330: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46  _INSTR_READ_BUFF
8340: 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66  ER, ((initial_of
8350: 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e  fset + offset) >
8360: 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e  > 8) & 0xff, (in
8370: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f  itial_offset + o
8380: 66 66 73 65 74 29 20 26 20 30 78 66 66 2c 20 73  ffset) & 0xff, s
8390: 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c  izeof(cmd), cmd,
83a0: 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65   0x00, &respcode
83b0: 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65  , buffer + offse
83c0: 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 09 09 69 66  t, &count);...if
83d0: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
83e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
83f0: 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64  {....if (respcod
8400: 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09  e == 0x6A86) {..
8410: 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74  ...if (max_count
8420: 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72   == 1) {......br
8430: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
8440: 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  max_count = max_
8450: 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09  count / 2;......
8460: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
8470: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8480: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73  PRINTF("cackey_s
8490: 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65  end_apdu() faile
84a0: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
84b0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72  failure");.....r
84c0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
84d0: 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e  ..offset += coun
84e0: 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20  t;....if (count 
84f0: 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09  < max_count) {..
8500: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8510: 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61  RINTF("Short rea
8520: 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c  d -- count = %i,
8530: 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 63   cmd[1] = %i", c
8540: 6f 75 6e 74 2c 20 63 6d 64 5b 31 5d 29 3b 0a 0a  ount, cmd[1]);..
8550: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
8560: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8570: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
8580: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
8590: 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28  ad %lu bytes", (
85a0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
85b0: 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e  ffset);...return
85c0: 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (offset);.}../*.
85d0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
85e0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
85f0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
8600: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
8610: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
8620: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
8630: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
8640: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
8650: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
8660: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8670: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
8680: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
8690: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
86a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
86b0: 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42 75  id. *         Bu
86c0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
86d0: 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65 6c  Applet ID to sel
86e0: 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  ect. *. *     si
86f0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20  ze_t aid_len. * 
8700: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
8710: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22  f bytes in the "
8720: 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44 29  aid" (Applet ID)
8730: 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a   parameter. *. *
8740: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
8750: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
8760: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
8770: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
8780: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8790: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
87a0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
87b0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
87c0: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
87d0: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
87e0: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
87f0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8800: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
8810: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
8820: 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e  _len) {..int sen
8830: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
8840: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
8850: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
8860: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
8870: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
8880: 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c  et:", aid, aid_l
8890: 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  en);...send_ret 
88a0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
88b0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
88c0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
88d0: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
88e0: 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45  , GSCIS_PARAM_SE
88f0: 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30  LECT_APPLET, 0x0
8900: 43 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c  C, aid_len, aid,
8910: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
8920: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73  L, NULL);..if (s
8930: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
8940: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
8950: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8960: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
8970: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74  open applet, ret
8980: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
8990: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
89a0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
89b0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
89c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
89d0: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
89e0: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
89f0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8a00: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
8a10: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
8a20: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
8a30: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
8a40: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
8a50: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
8a60: 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20  16_t ef);. *. * 
8a70: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
8a80: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
8a90: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
8aa0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
8ab0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
8ac0: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74  . *     uint16_t
8ad0: 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45   ef. *         E
8ae0: 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f  lemental File to
8af0: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45   select. *. * RE
8b00: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
8b10: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
8b20: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
8b30: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
8b40: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8b50: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
8b60: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
8b70: 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61    This selects a
8b80: 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c  n Elementary Fil
8b90: 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65  e (EF) under the
8ba0: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63   currently selec
8bb0: 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63  ted. *     Dedic
8bc0: 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20  ated File (DF). 
8bd0: 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c  *. *     Typical
8be0: 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  ly this is calle
8bf0: 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e  d after selectin
8c00: 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70  g the correct Ap
8c10: 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20  plet (using. *  
8c20: 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74     cackey_select
8c30: 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20  _applet) for VM 
8c40: 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61  cards. *. */.sta
8c50: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
8c60: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
8c70: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
8c80: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
8c90: 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69  16_t ef) {..unsi
8ca0: 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75  gned char fid_bu
8cb0: 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  f[2];..int send_
8cc0: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
8cd0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
8ce0: 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  ed.");.../* Open
8cf0: 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20   the elementary 
8d00: 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66  file */..fid_buf
8d10: 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20  [0] = (ef >> 8) 
8d20: 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66  & 0xff;..fid_buf
8d30: 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b  [1] = ef & 0xff;
8d40: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8d50: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
8d60: 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20  g file: %04lx", 
8d70: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
8d80: 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  ef);...send_ret 
8d90: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
8da0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
8db0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
8dc0: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
8dd0: 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69  , 0x02, 0x0C, si
8de0: 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66  zeof(fid_buf), f
8df0: 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55  id_buf, 0x00, NU
8e00: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
8e10: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
8e20: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
8e30: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
8e40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
8e50: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  led to open file
8e60: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
8e70: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
8e80: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8e90: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
8ea0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8eb0: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
8ec0: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65  ly selected file
8ed0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
8ee0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
8ef0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
8f00: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
8f10: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
8f20: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
8f30: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20  entity *root);. 
8f40: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
8f50: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
8f60: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
8f70: 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  root. *         
8f80: 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20  Root of the TLV 
8f90: 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72  list to start fr
8fa0: 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55  eeing. *. * RETU
8fb0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
8fc0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
8fd0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
8fe0: 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20  ction frees the 
8ff0: 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65  TLV linked liste
9000: 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a  d returned from.
9010: 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72   *     "cackey_r
9020: 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a  ead_tlv". *. */.
9030: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
9040: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
9050: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
9060: 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73  tity *root) {..s
9070: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
9080: 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a  _entity *curr, *
9090: 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74  next;...if (root
90a0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
90b0: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
90c0: 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72  curr = root; cur
90d0: 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20  r; curr = next) 
90e0: 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d  {...next = curr-
90f0: 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63  >_next;....switc
9100: 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a  h (curr->tag) {.
9110: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
9120: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09  G_ACR_TABLE:....
9130: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
9140: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
9150: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29  if (curr->value)
9160: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
9170: 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d  r->value);.....}
9180: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
9190: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
91a0: 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63  RDURL:.....if (c
91b0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
91c0: 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  rl) {......free(
91d0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
91e0: 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  url);.....}.....
91f0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72  break;...}....fr
9200: 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72  ee(curr);..}...r
9210: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
9220: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
9230: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
9240: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
9250: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
9260: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
9270: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
9280: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
9290: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
92a0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b  tlv_entity *cack
92b0: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75  ey_read_tlv(stru
92c0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
92d0: 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20  slot) {..struct 
92e0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
92f0: 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20  y *curr_entity, 
9300: 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c  *root = NULL, *l
9310: 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73  ast = NULL;..uns
9320: 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f  igned char tlen_
9330: 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66  buf[2], tval_buf
9340: 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09  [1024], *tval;..
9350: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c  unsigned char vl
9360: 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f  en_buf[2], vval_
9370: 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c  buf[8192], *vval
9380: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
9390: 20 2a 74 6d 70 62 75 66 3b 0a 09 73 73 69 7a 65   *tmpbuf;..ssize
93a0: 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09  _t tlen, vlen;..
93b0: 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74  ssize_t read_ret
93c0: 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74  ;..size_t offset
93d0: 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76  _t = 0, offset_v
93e0: 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20   = 0;..unsigned 
93f0: 63 68 61 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f  char tag;..size_
9400: 74 20 6c 65 6e 67 74 68 3b 0a 09 75 4c 6f 6e 67  t length;..uLong
9410: 66 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e  f tmpbuflen;..in
9420: 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  t uncompress_ret
9430: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
9440: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
9450: 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ");...read_ret =
9460: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
9470: 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62  fer(slot, tlen_b
9480: 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f  uf, sizeof(tlen_
9490: 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f  buf), 1, offset_
94a0: 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  t);..if (read_re
94b0: 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e  t != sizeof(tlen
94c0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
94d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
94e0: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
94f0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
9500: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
9510: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20  ULL);..}...tlen 
9520: 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (tlen_buf[1] <
9530: 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b  < 8) | tlen_buf[
9540: 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  0];...read_ret =
9550: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
9560: 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62  fer(slot, vlen_b
9570: 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f  uf, sizeof(vlen_
9580: 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f  buf), 2, offset_
9590: 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  v);..if (read_re
95a0: 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e  t != sizeof(vlen
95b0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
95c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
95d0: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
95e0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
95f0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
9600: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20  ULL);..}...vlen 
9610: 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (vlen_buf[1] <
9620: 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b  < 8) | vlen_buf[
9630: 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  0];...CACKEY_DEB
9640: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c  UG_PRINTF("Tag L
9650: 65 6e 67 74 68 20 3d 20 25 69 2c 20 56 61 6c 75  ength = %i, Valu
9660: 65 20 4c 65 6e 67 74 68 20 3d 20 25 69 22 2c 20  e Length = %i", 
9670: 74 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a 09 6f  tlen, vlen);...o
9680: 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f  ffset_t += 2;..o
9690: 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09  ffset_v += 2;...
96a0: 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f  if (tlen > sizeo
96b0: 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09  f(tval_buf)) {..
96c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
96d0: 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68  INTF("Tag length
96e0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72   is too large, r
96f0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
9700: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
9710: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
9720: 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76  (vlen > sizeof(v
9730: 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  val_buf)) {...CA
9740: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9750: 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20  F("Value length 
9760: 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65  is too large, re
9770: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
9780: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
9790: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64  NULL);..}...read
97a0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65  _ret = cackey_re
97b0: 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20  ad_buffer(slot, 
97c0: 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20  tval_buf, tlen, 
97d0: 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69  1, offset_t);..i
97e0: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74  f (read_ret != t
97f0: 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  len) {...CACKEY_
9800: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
9810: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74  able to read ent
9820: 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65  ire T-buffer, re
9830: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
9840: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
9850: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64  NULL);..}...read
9860: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65  _ret = cackey_re
9870: 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20  ad_buffer(slot, 
9880: 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20  vval_buf, vlen, 
9890: 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69  2, offset_v);..i
98a0: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76  f (read_ret != v
98b0: 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  len) {...CACKEY_
98c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
98d0: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74  able to read ent
98e0: 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65  ire V-buffer, re
98f0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
9900: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
9910: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c  NULL);..}...tval
9920: 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76   = tval_buf;..vv
9930: 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09  al = vval_buf;..
9940: 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20  while (tlen > 0 
9950: 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09  && vlen > 0) {..
9960: 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09  .tag = *tval;...
9970: 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d  tval++;...tlen--
9980: 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d  ;....if (*tval =
9990: 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e  = 0xff) {....len
99a0: 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c  gth = (tval[2] <
99b0: 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a  < 8) | tval[1];.
99c0: 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09  ...tval += 3;...
99d0: 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20  .tlen -= 3;...} 
99e0: 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68  else {....length
99f0: 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61   = *tval;....tva
9a00: 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a  l++;....tlen--;.
9a10: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
9a20: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a  BUG_PRINTF("Tag:
9a30: 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41 43   %s (%02x)", CAC
9a40: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54  KEY_DEBUG_FUNC_T
9a50: 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20  AG_TO_STR(tag), 
9a60: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74  (unsigned int) t
9a70: 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  ag);...CACKEY_DE
9a80: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61  BUG_PRINTBUF("Va
9a90: 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e  lue:", vval, len
9aa0: 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e  gth);....curr_en
9ab0: 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73  tity = NULL;...s
9ac0: 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09  witch (tag) {...
9ad0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
9ae0: 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72  CARDURL:.....cur
9af0: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
9b00: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
9b10: 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72  ntity));.....cur
9b20: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
9b30: 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63  cardurl = malloc
9b40: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
9b50: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
9b60: 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63  url));......memc
9b70: 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  py(curr_entity->
9b80: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
9b90: 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09  id, vval, 5);...
9ba0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
9bb0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
9bc0: 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b  ptype = vval[5];
9bd0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
9be0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
9bf0: 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61  >objectid = (vva
9c00: 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61  l[6] << 8) | vva
9c10: 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[7];.....curr_e
9c20: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
9c30: 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76  durl->appid = (v
9c40: 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76  val[8] << 8) | v
9c50: 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72  val[9];......cur
9c60: 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20  r_entity->tag = 
9c70: 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  tag;.....curr_en
9c80: 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55  tity->_next = NU
9c90: 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  LL;......break;.
9ca0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
9cb0: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09  G_ACR_TABLE:....
9cc0: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d  .curr_entity = m
9cd0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
9ce0: 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  rr_entity));....
9cf0: 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  .tmpbuf = malloc
9d00: 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d  (length);......m
9d10: 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76  emcpy(tmpbuf, vv
9d20: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09  al, length);....
9d30: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
9d40: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
9d50: 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74  rr_entity->lengt
9d60: 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09  h = length;.....
9d70: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
9d80: 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09  ue = tmpbuf;....
9d90: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
9da0: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
9db0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
9dc0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
9dd0: 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f  ICATE:.....curr_
9de0: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
9df0: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
9e00: 69 74 79 29 29 3b 0a 0a 09 09 09 09 74 6d 70 62  ity));......tmpb
9e10: 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a  uflen = length *
9e20: 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d   2;.....tmpbuf =
9e30: 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
9e40: 6e 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45  n);..#ifdef HAVE
9e50: 5f 4c 49 42 5a 0a 09 09 09 09 43 41 43 4b 45 59  _LIBZ.....CACKEY
9e60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
9e70: 22 44 65 63 6f 6d 70 72 65 73 73 69 6e 67 3a 22  "Decompressing:"
9e80: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
9e90: 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f  .....uncompress_
9ea0: 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73  ret = uncompress
9eb0: 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66  (tmpbuf, &tmpbuf
9ec0: 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  len, vval, lengt
9ed0: 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f  h);.....if (unco
9ee0: 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f  mpress_ret != Z_
9ef0: 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  OK) {......CACKE
9f00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9f10: 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70  Failed to decomp
9f20: 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73  ress, uncompress
9f30: 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d  () returned %i -
9f40: 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64  - resorting to d
9f50: 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63  irect copy", unc
9f60: 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09  ompress_ret);...
9f70: 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
9f80: 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d  length;......mem
9f90: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
9fa0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d  , length);.....}
9fb0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
9fc0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63  UG_PRINTBUF("Dec
9fd0: 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20  ompressed to:", 
9fe0: 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65  tmpbuf, tmpbufle
9ff0: 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41  n);.#else.....CA
a000: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a010: 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20  F("Missing ZLIB 
a020: 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65  Support, this ce
a030: 72 74 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b  rtificate is lik
a040: 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29  ely useless...")
a050: 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  ;......tmpbuflen
a060: 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d   = length;.....m
a070: 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76  emcpy(tmpbuf, vv
a080: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e  al, length);.#en
a090: 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e  dif......curr_en
a0a0: 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b  tity->tag = tag;
a0b0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a0c0: 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75  ->length = tmpbu
a0d0: 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65  flen;.....curr_e
a0e0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74  ntity->value = t
a0f0: 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f  mpbuf;.....curr_
a100: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
a110: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
a120: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
a130: 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09  TAG_PKCS15:.....
a140: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
a150: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
a160: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  r_entity));.....
a170: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
a180: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
a190: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
a1a0: 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a  byte = vval[0];.
a1b0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
a1c0: 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a  >_next = NULL;..
a1d0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
a1e0: 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68  ..vval += length
a1f0: 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67  ;...vlen -= leng
a200: 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f  th;....if (curr_
a210: 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20  entity != NULL) 
a220: 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d  {....if (root ==
a230: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f   NULL) {.....roo
a240: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
a250: 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61  ....}.....if (la
a260: 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st != NULL) {...
a270: 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20  ..last->_next = 
a280: 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09  curr_entity;....
a290: 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72  }.....last = cur
a2a0: 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d  r_entity;...}..}
a2b0: 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b  ...return(root);
a2c0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
a2d0: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
a2e0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
a2f0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
a300: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
a310: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
a320: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
a330: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
a340: 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72   cackey_free_cer
a350: 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ts(struct cackey
a360: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
a370: 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f  start, size_t co
a380: 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74  unt, int free_st
a390: 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69  art) {..size_t i
a3a0: 64 78 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  dx;...for (idx =
a3b0: 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b   0; idx < count;
a3c0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
a3d0: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
a3e0: 66 69 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65  ficate) {....fre
a3f0: 65 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72  e(start[idx].cer
a400: 74 69 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09  tificate);...}..
a410: 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61  }...if (free_sta
a420: 72 74 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61  rt) {...free(sta
a430: 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  rt);..}...return
a440: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
a450: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
a460: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
a470: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
a480: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
a490: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
a4a0: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
a4b0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  *. */.static str
a4c0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
a4d0: 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  identity *cackey
a4e0: 5f 72 65 61 64 5f 63 65 72 74 73 28 73 74 72 75  _read_certs(stru
a4f0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
a500: 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63  slot, struct cac
a510: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
a520: 79 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e  y *certs, unsign
a530: 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20  ed long *count) 
a540: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
a550: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
a560: 63 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74  curr_id;..struct
a570: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
a580: 74 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63  ty *ccc_tlv, *cc
a590: 63 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76  c_curr, *app_tlv
a5a0: 2c 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e  , *app_curr;..un
a5b0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f  signed char ccc_
a5c0: 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41  aid[] = {GSCIS_A
a5d0: 49 44 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e  ID_CCC};..unsign
a5e0: 65 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64  ed char curr_aid
a5f0: 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  [7];..unsigned l
a600: 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a  ong outidx = 0;.
a610: 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e  .cackey_ret tran
a620: 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 69 6e  saction_ret;..in
a630: 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  t certs_resizabl
a640: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
a650: 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09  , select_ret;...
a660: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a670: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
a680: 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e  ..if (count == N
a690: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
a6a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f  DEBUG_PRINTF("co
a6b0: 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74  unt is NULL, ret
a6c0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
a6d0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
a6e0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a  ULL);..}...if (*
a6f0: 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  count == 0) {...
a700: 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c  if (certs != NUL
a710: 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  L) {....CACKEY_D
a720: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
a730: 75 65 73 74 65 64 20 77 65 20 72 65 74 75 72 6e  uested we return
a740: 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72   0 objects, shor
a750: 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09  t-circuit");....
a760: 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a  .return(certs);.
a770: 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69  ..}..}.../* Begi
a780: 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74 72  n a SmartCard tr
a790: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72  ansaction */..tr
a7a0: 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20  ansaction_ret = 
a7b0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
a7c0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
a7d0: 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e  .if (transaction
a7e0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
a7f0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
a800: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a810: 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20  F("Unable begin 
a820: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
a830: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
a840: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
a850: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ULL);..}...if (c
a860: 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  erts == NULL) {.
a870: 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..certs = malloc
a880: 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20  (sizeof(*certs) 
a890: 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d  * 5);...*count =
a8a0: 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69   5;...certs_resi
a8b0: 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c  zable = 1;..} el
a8c0: 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73  se {...certs_res
a8d0: 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a  izable = 0;..}..
a8e0: 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43  ./* Select the C
a8f0: 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65  CC Applet */..se
a900: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
a910: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
a920: 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a  ot, ccc_aid, siz
a930: 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09  eof(ccc_aid));..
a940: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
a950: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
a960: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a970: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
a980: 65 20 74 6f 20 73 65 6c 65 63 74 20 43 43 43 20  e to select CCC 
a990: 41 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e  Applet, returnin
a9a0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a9b0: 0a 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20  .../* Terminate 
a9c0: 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61  SmartCard Transa
a9d0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ction */...cacke
a9e0: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
a9f0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75  n(slot);....retu
aa00: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
aa10: 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61  * Read all the a
aa20: 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20  pplets from the 
aa30: 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63  CCC's TLV */..cc
aa40: 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72  c_tlv = cackey_r
aa50: 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a  ead_tlv(slot);..
aa60: 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52  ./* Look for CAR
aa70: 44 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65  DURLs that coore
aa80: 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70  spond to PKI app
aa90: 6c 65 74 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63  lets */..for (cc
aaa0: 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76  c_curr = ccc_tlv
aab0: 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f  ; ccc_curr; ccc_
aac0: 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d  curr = ccc_curr-
aad0: 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 43 41 43 4b  >_next) {...CACK
aae0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
aaf0: 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e  "Found tag: %s .
ab00: 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  .. ", CACKEY_DEB
ab10: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
ab20: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67  TR(ccc_curr->tag
ab30: 29 29 3b 0a 0a 09 09 69 66 20 28 63 63 63 5f 63  ));....if (ccc_c
ab40: 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49  urr->tag != GSCI
ab50: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b  S_TAG_CARDURL) {
ab60: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ab70: 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
ab80: 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
ab90: 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
aba0: 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09  ARDURLs)");.....
abb0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
abc0: 09 69 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e  .if ((ccc_curr->
abd0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
abe0: 70 70 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f  pptype & CACKEY_
abf0: 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20  TLV_APP_PKI) != 
ac00: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
ac10: 4b 49 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  KI) {....CACKEY_
ac20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
ac30: 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
ac40: 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
ac50: 6f 75 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c  out PKI applets,
ac60: 20 74 68 69 73 20 61 70 70 6c 65 74 20 73 75 70   this applet sup
ac70: 70 6f 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22  ports: %s/%02x)"
ac80: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
ac90: 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53  UNC_APPTYPE_TO_S
aca0: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
acb0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
acc0: 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ype), (unsigned 
acd0: 69 6e 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  int) ccc_curr->v
ace0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
acf0: 70 74 79 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74  ptype);.....cont
ad00: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  inue;...}....CAC
ad10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
ad20: 55 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63  UF("RID:", ccc_c
ad30: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
ad40: 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28  rl->rid, sizeof(
ad50: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
ad60: 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a  cardurl->rid));.
ad70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ad80: 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25  RINTF("AppID = %
ad90: 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59  s/%04lx", CACKEY
ada0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49  _DEBUG_FUNC_OBJI
adb0: 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  D_TO_STR(ccc_cur
adc0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
add0: 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67  ->appid), (unsig
ade0: 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75  ned long) ccc_cu
adf0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
ae00: 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 43 41 43  l->appid);...CAC
ae10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ae20: 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f  ("ObjectID = %s/
ae30: 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
ae40: 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
ae50: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
ae60: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
ae70: 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69  objectid), (unsi
ae80: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63  gned long) ccc_c
ae90: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
aea0: 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a  rl->objectid);..
aeb0: 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69  ..memcpy(curr_ai
aec0: 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  d, ccc_curr->val
aed0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
aee0: 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72   sizeof(ccc_curr
aef0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
af00: 3e 72 69 64 29 29 3b 0a 09 09 63 75 72 72 5f 61  >rid));...curr_a
af10: 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
af20: 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f  id) - 2] = (ccc_
af30: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
af40: 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29  url->appid >> 8)
af50: 20 26 20 30 78 66 66 3b 0a 09 09 63 75 72 72 5f   & 0xff;...curr_
af60: 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f  aid[sizeof(curr_
af70: 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f  aid) - 1] = ccc_
af80: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
af90: 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66  url->appid & 0xf
afa0: 66 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20  f;..../* Select 
afb0: 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e  found applet ...
afc0: 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74   */...select_ret
afd0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
afe0: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75  _applet(slot, cu
aff0: 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  rr_aid, sizeof(c
b000: 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 69 66 20  urr_aid));...if 
b010: 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43  (select_ret != C
b020: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
b030: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
b040: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
b050: 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c  d to select appl
b060: 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  et, skipping pro
b070: 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
b080: 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f  object");.....co
b090: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f  ntinue;...}..../
b0a0: 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74  * ... and object
b0b0: 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c   (file) */...sel
b0c0: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
b0d0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f  _select_file(slo
b0e0: 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  t, ccc_curr->val
b0f0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
b100: 63 74 69 64 29 3b 0a 09 09 69 66 20 28 73 65 6c  ctid);...if (sel
b110: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
b120: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
b130: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b140: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
b150: 20 73 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b   select file, sk
b160: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
b170: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
b180: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
b190: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63  ;...}..../* Proc
b1a0: 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20  ess this file's 
b1b0: 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  TLV looking for 
b1c0: 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a  certificates */.
b1d0: 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b  ..app_tlv = cack
b1e0: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74  ey_read_tlv(slot
b1f0: 29 3b 0a 0a 09 09 66 6f 72 20 28 61 70 70 5f 63  );....for (app_c
b200: 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61  urr = app_tlv; a
b210: 70 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72  pp_curr; app_cur
b220: 72 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e  r = app_curr->_n
b230: 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ext) {....CACKEY
b240: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
b250: 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43  ound tag: %s", C
b260: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
b270: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f  _TAG_TO_STR(app_
b280: 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09  curr->tag));....
b290: 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61  if (app_curr->ta
b2a0: 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43  g != GSCIS_TAG_C
b2b0: 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
b2c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b2d0: 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69  RINTF("  ... ski
b2e0: 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c  pping it (we onl
b2f0: 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 45 52  y care about CER
b300: 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09  TIFICATEs)");...
b310: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
b320: 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20  }.....curr_id = 
b330: 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a  &certs[outidx];.
b340: 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09  ...outidx++;....
b350: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d  .memcpy(curr_id-
b360: 3e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69  >applet, curr_ai
b370: 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69  d, sizeof(curr_i
b380: 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09  d->applet));....
b390: 63 75 72 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20  curr_id->file = 
b3a0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
b3b0: 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
b3c0: 64 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6c  d;....curr_id->l
b3d0: 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  abel = NULL;....
b3e0: 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
b3f0: 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f  icate_len = app_
b400: 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09  curr->length;...
b410: 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
b420: 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
b430: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
b440: 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65  cate_len);....me
b450: 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65  mcpy(curr_id->ce
b460: 72 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63  rtificate, app_c
b470: 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72  urr->value, curr
b480: 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
b490: 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 6f  _len);.....if (o
b4a0: 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
b4b0: 20 7b 0a 09 09 09 09 69 66 20 28 63 65 72 74 73   {.....if (certs
b4c0: 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09  _resizable) {...
b4d0: 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a  ...*count *= 2;.
b4e0: 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 65 61  .....certs = rea
b4f0: 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65  lloc(certs, size
b500: 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63  of(*certs) * (*c
b510: 6f 75 6e 74 29 29 3b 0a 09 09 09 09 7d 20 65 6c  ount));.....} el
b520: 73 65 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b  se {......break;
b530: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a  .....}....}...}.
b540: 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74  ...cackey_free_t
b550: 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09  lv(app_tlv);....
b560: 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
b570: 6f 75 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b  ount) {....break
b580: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65  ;...}..}...cacke
b590: 79 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74  y_free_tlv(ccc_t
b5a0: 6c 76 29 3b 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20  lv);...*count = 
b5b0: 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65  outidx;...if (ce
b5c0: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b  rts_resizable) {
b5d0: 0a 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
b5e0: 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
b5f0: 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
b600: 6e 74 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 65  nt));..}.../* Te
b610: 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72  rminate SmartCar
b620: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
b630: 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
b640: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
b650: 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b  ..return(certs);
b660: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
b670: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
b680: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
b690: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
b6a0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
b6b0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
b6c0: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
b6d0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
b6e0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f  ey_ret cackey_lo
b6f0: 67 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  gin(struct cacke
b700: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
b710: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e  signed char *pin
b720: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
b730: 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72  pin_len, int *tr
b740: 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
b750: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
b760: 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b  r cac_pin[8] = {
b770: 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
b780: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
b790: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b  FF, 0xFF, 0xFF};
b7a0: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f  ..uint16_t respo
b7b0: 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74  nse_code;..int t
b7c0: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
b7d0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
b7e0: 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  ./* Indicate tha
b7f0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  t we do not know
b800: 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20   about how many 
b810: 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e  tries are remain
b820: 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65  ing */..if (trie
b830: 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
b840: 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
b850: 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a  ing_p = -1;..}..
b860: 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20  ./* Apparently, 
b870: 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58  CAC PINs are *EX
b880: 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c  ACTLY* 8 bytes l
b890: 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20  ong -- pad with 
b8a0: 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72  0xFF if too shor
b8b0: 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65  t */..if (pin_le
b8c0: 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63  n >= 8) {...memc
b8d0: 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
b8e0: 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   8);..} else {..
b8f0: 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c  .memcpy(cac_pin,
b900: 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a   pin, pin_len);.
b910: 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49  .}.../* Issue PI
b920: 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e  N Verify */..sen
b930: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
b940: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
b950: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
b960: 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  16, GSCIS_INSTR_
b970: 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20 30 78  VERIFY, 0x00, 0x
b980: 30 30 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70  00, sizeof(cac_p
b990: 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78  in), cac_pin, 0x
b9a0: 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f  00, &response_co
b9b0: 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  de, NULL, NULL);
b9c0: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
b9d0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
b9e0: 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73  OK) {...if ((res
b9f0: 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36  ponse_code & 0x6
ba00: 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20  3C0) == 0x63C0) 
ba10: 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69  {....tries_remai
ba20: 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65  ning = (response
ba30: 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09  _code & 0xF);...
ba40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ba50: 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
ba60: 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20  ication failed, 
ba70: 25 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69  %i tries remaini
ba80: 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69  ng", tries_remai
ba90: 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74  ning);.....if (t
baa0: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
bab0: 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72  ) {.....*tries_r
bac0: 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69  emaining_p = tri
bad0: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09  es_remaining;...
bae0: 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  .}.....return(CA
baf0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
bb00: 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  IN);...}....if (
bb10: 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d  response_code ==
bb20: 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41   0x6983) {....CA
bb30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bb40: 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
bb50: 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69  ion failed, devi
bb60: 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a  ce is locked");.
bb70: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
bb80: 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29  Y_PCSC_E_LOCKED)
bb90: 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  ;...}....return(
bba0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
bbb0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
bbc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bbd0: 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
bbe0: 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a  on succeeded");.
bbf0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
bc00: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
bc10: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
bc20: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
bc30: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
bc40: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
bc50: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
bc60: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
bc70: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
bc80: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
bc90: 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70  t cackey_token_p
bca0: 72 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61  resent(struct ca
bcb0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
bcc0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
bcd0: 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47  r ccc_aid[] = {G
bce0: 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09  SCIS_AID_CCC};..
bcf0: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
bd00: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43 43  /* Select the CC
bd10: 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e  C Applet */..sen
bd20: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
bd30: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
bd40: 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65  t, ccc_aid, size
bd50: 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69  of(ccc_aid));..i
bd60: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
bd70: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
bd80: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
bd90: 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41  EY_PCSC_S_TOKENA
bda0: 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 72 65 74  BSENT);..}...ret
bdb0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
bdc0: 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b  S_TOKENPRESENT);
bdd0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30  .}../* Returns 0
bde0: 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73   on success */.s
bdf0: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
be00: 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f  _mutex_create(vo
be10: 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70  id **mutex) {..p
be20: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
be30: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
be40: 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
be50: 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
be60: 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
be70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
be80: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
be90: 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
bea0: 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
beb0: 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
bec0: 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
bed0: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
bee0: 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  x = malloc(sizeo
bef0: 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  f(*pthread_mutex
bf00: 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65  ));...if (!pthre
bf10: 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43  ad_mutex) {....C
bf20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bf30: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c  TF("Failed to al
bf40: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29  locate memory.")
bf50: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
bf60: 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64  ;...}....pthread
bf70: 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
bf80: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68  d_mutex_init(pth
bf90: 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c  read_mutex, NULL
bfa0: 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64  );...if (pthread
bfb0: 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
bfc0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bfd0: 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f  PRINTF("pthread_
bfe0: 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74  mutex_init() ret
bff0: 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29  urned error (%i)
c000: 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76  .", pthread_retv
c010: 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
c020: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74  -1);...}....*mut
c030: 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  ex = pthread_mut
c040: 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ex;..} else {...
c050: 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  if (cackey_args.
c060: 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09  CreateMutex) {..
c070: 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20  ..custom_retval 
c080: 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  = cackey_args.Cr
c090: 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29  eateMutex(mutex)
c0a0: 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d  ;.....if (custom
c0b0: 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f  _retval != CKR_O
c0c0: 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
c0d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
c0e0: 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
c0f0: 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64  Mutex() returned
c100: 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20   error (%li).", 
c110: 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65  (long) custom_re
c120: 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75  tval);......retu
c130: 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d  rn(-1);....}...}
c140: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
c150: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
c160: 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79  ning sucessfully
c170: 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e   (0)");...return
c180: 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  (0);.}../* Retur
c190: 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
c1a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
c1b0: 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
c1c0: 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09  void *mutex) {..
c1d0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
c1e0: 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a  *pthread_mutex;.
c1f0: 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74  .int pthread_ret
c200: 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74  val;..CK_RV cust
c210: 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  om_retval;...CAC
c220: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c230: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
c240: 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  f ((cackey_args.
c250: 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c  flags & CKF_OS_L
c260: 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b  OCKING_OK) == CK
c270: 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
c280: 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   {...pthread_mut
c290: 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70  ex = mutex;....p
c2a0: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20  thread_retval = 
c2b0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
c2c0: 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ck(pthread_mutex
c2d0: 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64  );...if (pthread
c2e0: 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
c2f0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c300: 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f  PRINTF("pthread_
c310: 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74  mutex_lock() ret
c320: 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29  urned error (%i)
c330: 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76  .", pthread_retv
c340: 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
c350: 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  -1);...}..} else
c360: 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
c370: 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20  args.LockMutex) 
c380: 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
c390: 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
c3a0: 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78  .LockMutex(mutex
c3b0: 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
c3c0: 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
c3d0: 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
c3e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
c3f0: 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
c400: 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
c410: 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
c420: 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
c430: 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
c440: 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
c450: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
c460: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
c470: 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
c480: 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
c490: 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  0);.}../* Return
c4a0: 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  s 0 on success *
c4b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
c4c0: 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
c4d0: 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a  (void *mutex) {.
c4e0: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
c4f0: 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
c500: 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
c510: 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
c520: 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
c530: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c540: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
c550: 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
c560: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
c570: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
c580: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
c590: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
c5a0: 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09  tex = mutex;....
c5b0: 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d  pthread_retval =
c5c0: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75   pthread_mutex_u
c5d0: 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75  nlock(pthread_mu
c5e0: 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72  tex);...if (pthr
c5f0: 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
c600: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
c610: 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
c620: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
c630: 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
c640: 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
c650: 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
c660: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
c670: 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
c680: 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
c690: 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
c6a0: 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
c6b0: 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
c6c0: 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
c6d0: 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
c6e0: 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
c6f0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c700: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
c710: 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28  rgs.UnlockMutex(
c720: 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
c730: 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
c740: 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
c750: 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
c760: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
c770: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c780: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
c790: 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
c7a0: 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
c7b0: 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52  ..static CK_ATTR
c7c0: 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79  IBUTE_PTR cackey
c7d0: 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
c7e0: 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20  CK_OBJECT_CLASS 
c7f0: 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72  objectclass, str
c800: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
c810: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
c820: 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ty, unsigned lon
c830: 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20  g identity_num, 
c840: 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
c850: 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63  Count) {..static
c860: 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75   CK_BBOOL ck_tru
c870: 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43  e = 1;..static C
c880: 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65  K_BBOOL ck_false
c890: 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20   = 0;..CK_ULONG 
c8a0: 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65  numattrs = 0, re
c8b0: 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f  tval_count;..CK_
c8c0: 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63  ATTRIBUTE_TYPE c
c8d0: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
c8e0: 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72  CK_ATTRIBUTE cur
c8f0: 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b  r_attr, *retval;
c900: 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56  ..CK_VOID_PTR pV
c910: 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  alue;..CK_ULONG 
c920: 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f  ulValueLen;..CK_
c930: 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f  OBJECT_CLASS ck_
c940: 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43  object_class;..C
c950: 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
c960: 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74  PE ck_certificat
c970: 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f  e_type;..CK_KEY_
c980: 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65  TYPE ck_key_type
c990: 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75  ;..CK_UTF8CHAR u
c9a0: 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09  cTmpBuf[1024];..
c9b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
c9c0: 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69  ertificate;..ssi
c9d0: 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65  ze_t certificate
c9e0: 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f  _len = -1, x509_
c9f0: 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70  read_ret;..int p
ca00: 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41  Value_free;...CA
ca10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ca20: 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63  F("Called (objec
ca30: 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64  tClass = %lu, id
ca40: 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75  entity_num = %lu
ca50: 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
ca60: 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73  ong) objectclass
ca70: 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b  , identity_num);
ca80: 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
ca90: 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
caa0: 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63  ICATE && objectc
cab0: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c  lass != CKO_PUBL
cac0: 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74  IC_KEY && object
cad0: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49  class != CKO_PRI
cae0: 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 43 41  VATE_KEY) {...CA
caf0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cb00: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
cb10: 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69  bjects (NULL), i
cb20: 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c  nvalid object cl
cb30: 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ass");....return
cb40: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
cb50: 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20  Get Cert */..if 
cb60: 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  (identity == NUL
cb70: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
cb80: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
cb90: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
cba0: 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
cbb0: 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64  identiy provided
cbc0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
cbd0: 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66  LL);..}...certif
cbe0: 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79  icate = identity
cbf0: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  ->certificate;..
cc00: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
cc10: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
cc20: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69  ificate_len;...i
cc30: 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
cc40: 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74  en == -1 || cert
cc50: 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29  ificate == NULL)
cc60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
cc70: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
cc80: 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
cc90: 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74  ULL), this ident
cca0: 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ity does not hav
ccb0: 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69  e an X.509 certi
ccc0: 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
ccd0: 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69  d with it and wi
cce0: 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a  ll not work");..
ccf0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
cd00: 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
cd10: 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20  hat certificate 
cd20: 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64  is ASN.1 encoded
cd30: 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
cd40: 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f  te */..if (x509_
cd50: 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
cd60: 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
cd70: 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20  te_len, NULL) < 
cd80: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
cd90: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
cda0: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
cdb0: 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30  (NULL), the X.50
cdc0: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73  9 certificate as
cdd0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
cde0: 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e  is identity is n
cdf0: 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72  ot valid");....r
ce00: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
ce10: 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d  ..retval_count =
ce20: 20 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d   16;..retval = m
ce30: 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75  alloc(retval_cou
ce40: 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
ce50: 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75  val));...for (cu
ce60: 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30  rr_attr_type = 0
ce70: 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ; curr_attr_type
ce80: 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b 20 63   < 0xce53635f; c
ce90: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29  urr_attr_type++)
cea0: 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74   {...if (curr_at
ceb0: 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30  tr_type == 0x800
cec0: 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72  ) {....curr_attr
ced0: 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33  _type = 0xce5363
cee0: 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75  00;...}....pValu
cef0: 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56  e_free = 0;...pV
cf00: 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75  alue = NULL;...u
cf10: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
cf20: 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69  LONG) -1;....swi
cf30: 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74  tch (curr_attr_t
cf40: 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
cf50: 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41  KA_CLASS:.....CA
cf60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cf70: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
cf80: 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53  tribute CKA_CLAS
cf90: 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  S (0x%08lx) ..."
cfa0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
cfb0: 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
cfc0: 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63  );......ck_objec
cfd0: 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74  t_class = object
cfe0: 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c  class;......pVal
cff0: 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f  ue = &ck_object_
d000: 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c  class;.....ulVal
d010: 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
d020: 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b  k_object_class);
d030: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
d040: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
d050: 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
d060: 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
d070: 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f  ed long) *((CK_O
d080: 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70  BJECT_CLASS *) p
d090: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
d0a0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d0b0: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
d0c0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
d0d0: 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09   CKA_TOKEN:.....
d0e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d0f0: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
d100: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f  attribute CKA_TO
d110: 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  KEN (0x%08lx) ..
d120: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
d130: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
d140: 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
d150: 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
d160: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
d170: 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
d180: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d190: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
d1a0: 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
d1b0: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
d1c0: 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
d1d0: 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
d1e0: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
d1f0: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
d200: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
d210: 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
d220: 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b  FIABLE:.....CACK
d230: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d240: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
d250: 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49  ibute CKA_MODIFI
d260: 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
d270: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
d280: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
d290: 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
d2a0: 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
d2b0: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
d2c0: 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
d2d0: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
d2e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
d2f0: 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
d300: 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
d310: 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
d320: 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
d330: 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
d340: 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
d350: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
d360: 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c  k;....case CKA_L
d370: 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABEL:.....CACKEY
d380: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
d390: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
d3a0: 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30  ute CKA_LABEL (0
d3b0: 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
d3c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
d3d0: 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
d3e0: 09 09 09 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..../* Determine
d3f0: 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 69 66 20   name */.....if 
d400: 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
d410: 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
d420: 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
d430: 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
d440: 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
d450: 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
d460: 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
d470: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
d480: 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
d490: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
d4a0: 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
d4b0: 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
d4c0: 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
d4d0: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
d4e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d4f0: 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28   ... returning (
d500: 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65  %p/%lu)", pValue
d510: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
d520: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
d530: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
d540: 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09  se CKA_VALUE:...
d550: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d560: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
d570: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
d580: 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20  VALUE (0x%08lx) 
d590: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
d5a0: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
d5b0: 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74  type);......swit
d5c0: 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29  ch (objectclass)
d5d0: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f   {......case CKO
d5e0: 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09  _PRIVATE_KEY:...
d5f0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d600: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
d610: 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
d620: 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
d630: 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29  a private key.")
d640: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
d650: 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55  .....case CKO_PU
d660: 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09  BLIC_KEY:.......
d670: 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a  /* XXX: TODO */.
d680: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
d690: 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54  ...case CKO_CERT
d6a0: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70  IFICATE:.......p
d6b0: 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63  Value = certific
d6c0: 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c  ate;.......ulVal
d6d0: 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63  ueLen = certific
d6e0: 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09  ate_len;........
d6f0: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
d700: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d710: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
d720: 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
d730: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
d740: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
d750: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
d760: 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55  ...case CKA_ISSU
d770: 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
d780: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
d790: 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
d7a0: 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78  e CKA_ISSUER (0x
d7b0: 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
d7c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
d7d0: 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
d7e0: 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
d7f0: 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
d800: 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
d810: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d820: 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
d830: 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
d840: 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
d850: 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a  certificate.");.
d860: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
d870: 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
d880: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
d890: 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
d8a0: 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
d8b0: 5f 69 73 73 75 65 72 28 63 65 72 74 69 66 69 63  _issuer(certific
d8c0: 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
d8d0: 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
d8e0: 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
d8f0: 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
d900: 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
d910: 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
d920: 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
d930: 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
d940: 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
d950: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
d960: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
d970: 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
d980: 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
d990: 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
d9a0: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
d9b0: 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
d9c0: 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09  ERIAL_NUMBER:...
d9d0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d9e0: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
d9f0: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
da00: 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30  SERIAL_NUMBER (0
da10: 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
da20: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
da30: 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
da40: 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
da50: 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
da60: 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
da70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
da80: 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
da90: 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
daa0: 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
dab0: 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b   certificate.");
dac0: 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
dad0: 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
dae0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
daf0: 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
db00: 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
db10: 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69  o_serial(certifi
db20: 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
db30: 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
db40: 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
db50: 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
db60: 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
db70: 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
db80: 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
db90: 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
dba0: 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
dbb0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
dbc0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
dbd0: 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
dbe0: 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
dbf0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
dc00: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
dc10: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
dc20: 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43  A_SUBJECT:.....C
dc30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
dc40: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
dc50: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42  ttribute CKA_SUB
dc60: 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e  JECT (0x%08lx) .
dc70: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
dc80: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
dc90: 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
dca0: 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
dcb0: 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
dcc0: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
dcd0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
dce0: 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
dcf0: 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
dd00: 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
dd10: 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  ate.");.......br
dd20: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
dd30: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
dd40: 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
dd50: 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
dd60: 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
dd70: 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
dd80: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
dd90: 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
dda0: 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
ddb0: 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
ddc0: 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
ddd0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
dde0: 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
ddf0: 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
de00: 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
de10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
de20: 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
de30: 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
de40: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
de50: 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
de60: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
de70: 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09  ase CKA_ID:.....
de80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
de90: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
dea0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44  attribute CKA_ID
deb0: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
dec0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ded0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
dee0: 3b 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b  ;......ucTmpBuf[
def0: 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f  0] = ((identity_
df00: 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26  num + 1) >> 8) &
df10: 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70   0xff;.....ucTmp
df20: 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74  Buf[1] =  (ident
df30: 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30  ity_num + 1) & 0
df40: 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  xff;......pValue
df50: 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09   = &ucTmpBuf;...
df60: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32  ..ulValueLen = 2
df70: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
df80: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
df90: 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
dfa0: 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
dfb0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
dfc0: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
dfd0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
dfe0: 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
dff0: 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
e000: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
e010: 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
e020: 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45   CKA_CERTIFICATE
e030: 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20  _TYPE (0x%08lx) 
e040: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
e050: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
e060: 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
e070: 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
e080: 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
e090: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
e0a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
e0b0: 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
e0c0: 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
e0d0: 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
e0e0: 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62  cate.");.......b
e0f0: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
e100: 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  ./* We only supp
e110: 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63  ort one certific
e120: 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09  ate type */.....
e130: 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
e140: 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b  ype = CKC_X_509;
e150: 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
e160: 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
e170: 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ype;.....ulValue
e180: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
e190: 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
e1a0: 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
e1b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
e1c0: 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f  . returning CKC_
e1d0: 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f  X_509 (%lu) (%p/
e1e0: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
e1f0: 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52   long) *((CK_CER
e200: 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29  TIFICATE_TYPE *)
e210: 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
e220: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e230: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
e240: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
e250: 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a  se CKA_KEY_TYPE:
e260: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
e270: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
e280: 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
e290: 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25  KA_KEY_TYPE (0x%
e2a0: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
e2b0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
e2c0: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
e2d0: 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
e2e0: 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s != CKO_PRIVATE
e2f0: 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
e300: 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass != CKO_PUBLI
e310: 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41  C_KEY) {......CA
e320: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e330: 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
e340: 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
e350: 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
e360: 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  key.");.......br
e370: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
e380: 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  /* We only suppo
e390: 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20  rt one key type 
e3a0: 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79  */.....ck_key_ty
e3b0: 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09  pe = CKK_RSA;...
e3c0: 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
e3d0: 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c  key_type;.....ul
e3e0: 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
e3f0: 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a  f(ck_key_type);.
e400: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
e410: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
e420: 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41  eturning CKK_RSA
e430: 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22   (%lu) (%p/%lu)"
e440: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e450: 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43  ) *((CK_CERTIFIC
e460: 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c  ATE_TYPE *) pVal
e470: 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
e480: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
e490: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
e4a0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
e4b0: 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b  A_SIGN:.....CACK
e4c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e4d0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
e4e0: 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28  ibute CKA_SIGN (
e4f0: 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
e500: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
e510: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
e520: 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
e530: 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
e540: 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
e550: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
e560: 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
e570: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
e580: 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
e590: 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
e5a0: 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
e5b0: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
e5c0: 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
e5d0: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
e5e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e5f0: 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
e600: 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
e610: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
e620: 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
e630: 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
e640: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
e650: 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
e660: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
e670: 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09  KA_DECRYPT:.....
e680: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e690: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
e6a0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45  attribute CKA_DE
e6b0: 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20  CRYPT (0x%08lx) 
e6c0: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
e6d0: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
e6e0: 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
e6f0: 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
e700: 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c  KO_PRIVATE_KEY |
e710: 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d  | objectclass ==
e720: 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29   CKO_PUBLIC_KEY)
e730: 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
e740: 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
e750: 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
e760: 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09  eof(ck_true);...
e770: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
e780: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
e790: 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
e7a0: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
e7b0: 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
e7c0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e7d0: 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
e7e0: 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
e7f0: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
e800: 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
e810: 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
e820: 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
e830: 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
e840: 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
e850: 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
e860: 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09  _SERVER_AUTH:...
e870: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e880: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
e890: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
e8a0: 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54  TRUST_SERVER_AUT
e8b0: 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  H (0x%08lx) ..."
e8c0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e8d0: 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
e8e0: 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
e8f0: 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
e900: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
e910: 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
e920: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e930: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
e940: 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
e950: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
e960: 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
e970: 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
e980: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
e990: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
e9a0: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
e9b0: 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
e9c0: 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09  CLIENT_AUTH:....
e9d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e9e0: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
e9f0: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
ea00: 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48  RUST_CLIENT_AUTH
ea10: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
ea20: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ea30: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
ea40: 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
ea50: 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c  &ck_true;.....ul
ea60: 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
ea70: 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09  f(ck_true);.....
ea80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ea90: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
eaa0: 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
eab0: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
eac0: 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
ead0: 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
eae0: 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
eaf0: 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
eb00: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
eb10: 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
eb20: 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09  ODE_SIGNING:....
eb30: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
eb40: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
eb50: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
eb60: 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e  RUST_CODE_SIGNIN
eb70: 47 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  G (0x%08lx) ..."
eb80: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
eb90: 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
eba0: 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
ebb0: 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
ebc0: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
ebd0: 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
ebe0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ebf0: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
ec00: 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
ec10: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
ec20: 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
ec30: 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
ec40: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
ec50: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
ec60: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
ec70: 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
ec80: 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e  EMAIL_PROTECTION
ec90: 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
eca0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
ecb0: 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
ecc0: 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f  CKA_TRUST_EMAIL_
ecd0: 50 52 4f 54 45 43 54 49 4f 4e 20 28 30 78 25 30  PROTECTION (0x%0
ece0: 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
ecf0: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
ed00: 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
ed10: 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
ed20: 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
ed30: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
ed40: 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
ed50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ed60: 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
ed70: 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
ed80: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
ed90: 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
eda0: 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
edb0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
edc0: 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
edd0: 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c  break;....defaul
ede0: 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  t:.....pValue = 
edf0: 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75  NULL;.....ulValu
ee00: 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
ee10: 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a   -1;.....break;.
ee20: 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f  ..}....if (((CK_
ee30: 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e  LONG) ulValueLen
ee40: 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20  ) != ((CK_LONG) 
ee50: 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73  -1)) {..../* Pus
ee60: 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f  h curr_attr onto
ee70: 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09   the stack */...
ee80: 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20  .curr_attr.type 
ee90: 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  = curr_attr_type
eea0: 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75  ;....curr_attr.u
eeb0: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61  lValueLen = ulVa
eec0: 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72  lueLen;.....curr
eed0: 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d  _attr.pValue = m
eee0: 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e  alloc(curr_attr.
eef0: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
ef00: 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72  memcpy(curr_attr
ef10: 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c  .pValue, pValue,
ef20: 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c   curr_attr.ulVal
ef30: 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28  ueLen);.....if (
ef40: 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70  pValue_free && p
ef50: 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65  Value) {.....fre
ef60: 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a  e(pValue);....}.
ef70: 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73  ....if (numattrs
ef80: 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74   >= retval_count
ef90: 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 5f 63  ) {.....retval_c
efa0: 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 72  ount *= 2;.....r
efb0: 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28  etval = realloc(
efc0: 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63  retval, retval_c
efd0: 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72  ount * sizeof(*r
efe0: 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09  etval));....}...
eff0: 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c  ..memcpy(&retval
f000: 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72  [numattrs], &cur
f010: 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63  r_attr, sizeof(c
f020: 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e  urr_attr));....n
f030: 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09  umattrs++;...}..
f040: 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73  }...if (numattrs
f050: 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61   != 0) {...retva
f060: 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74  l_count = numatt
f070: 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72  rs;...retval = r
f080: 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72  ealloc(retval, r
f090: 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
f0a0: 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
f0b0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65  .} else {...free
f0c0: 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74  (retval);....ret
f0d0: 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  val = NULL;..}..
f0e0: 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d  .*pulCount = num
f0f0: 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f  attrs;...CACKEY_
f100: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f110: 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65  turning %lu obje
f120: 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61  cts (%p).", numa
f130: 74 74 72 73 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  ttrs, retval);..
f140: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
f150: 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
f160: 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
f170: 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56  Initialize)(CK_V
f180: 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67  OID_PTR pInitArg
f190: 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49  s) {..CK_C_INITI
f1a0: 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54  ALIZE_ARGS CK_PT
f1b0: 52 20 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f  R args;..uint32_
f1c0: 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  t idx;..int mute
f1d0: 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 43 41  x_init_ret;...CA
f1e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f1f0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
f200: 69 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d  if (pInitArgs !=
f210: 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20   NULL) {...args 
f220: 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d  = pInitArgs;...m
f230: 65 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72  emcpy(&cackey_ar
f240: 67 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66  gs, args, sizeof
f250: 28 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a  (cackey_args));.
f260: 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65  ...if (args->Cre
f270: 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ateMutex == NULL
f280: 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f   || args->Destro
f290: 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c  yMutex == NULL |
f2a0: 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65  | args->LockMute
f2b0: 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x == NULL || arg
f2c0: 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d  s->UnlockMutex =
f2d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20  = NULL) {....if 
f2e0: 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74  (args->CreateMut
f2f0: 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
f300: 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78  gs->DestroyMutex
f310: 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   != NULL || args
f320: 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e  ->LockMutex != N
f330: 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c  ULL || args->Unl
f340: 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ockMutex != NULL
f350: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
f360: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
f370: 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f  or. Some, but no
f380: 74 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20  t All threading 
f390: 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69  primitives provi
f3a0: 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  ded.");......ret
f3b0: 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
f3c0: 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d  S_BAD);....}...}
f3d0: 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 70 52  ....if (args->pR
f3e0: 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29  eserved != NULL)
f3f0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
f400: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
f410: 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e  . pReserved is n
f420: 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 09  ot NULL.");.....
f430: 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
f440: 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 09  ENTS_BAD);...}..
f450: 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65  } else {...cacke
f460: 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
f470: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
f480: 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79  key_args.Destroy
f490: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
f4a0: 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
f4b0: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
f4c0: 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
f4d0: 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  ckMutex = NULL;.
f4e0: 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ..cackey_args.fl
f4f0: 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ags = 0;..}...if
f500: 20 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c   (cackey_initial
f510: 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
f520: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
f530: 72 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69  rror.  Already i
f540: 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
f550: 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
f560: 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e  PTOKI_ALREADY_IN
f570: 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
f580: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
f590: 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
f5a0: 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
f5b0: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
f5c0: 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
f5d0: 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  ++) {...cackey_s
f5e0: 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
f5f0: 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f  ive = 0;..}...fo
f600: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
f610: 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
f620: 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
f630: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
f640: 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
f650: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
f660: 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63  .active = 0;...c
f670: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
f680: 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
f690: 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ULL;...cackey_sl
f6a0: 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
f6b0: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
f6c0: 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  .}...cackey_init
f6d0: 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69  ialized = 1;...i
f6e0: 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f  f (!cackey_biglo
f6f0: 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74  ck_init) {...mut
f700: 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61  ex_init_ret = ca
f710: 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
f720: 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  e(&cackey_bigloc
f730: 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
f740: 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20  _init_ret != 0) 
f750: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
f760: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
f770: 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69    Mutex initiali
f780: 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29  zation failed.")
f790: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
f7a0: 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d  _CANT_LOCK);...}
f7b0: 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ....cackey_biglo
f7c0: 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a  ck_init = 1;..}.
f7d0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f7e0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
f7f0: 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
f800: 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
f810: 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
f820: 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
f830: 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a  CK_RV, C_Finaliz
f840: 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
f850: 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e  Reserved) {..uin
f860: 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43  t32_t idx;...CAC
f870: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f880: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
f890: 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
f8a0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
f8b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
f8c0: 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
f8d0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
f8e0: 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
f8f0: 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
f900: 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
f910: 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
f920: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f930: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
f940: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
f950: 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
f960: 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
f970: 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66  IALIZED);..}...f
f980: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
f990: 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
f9a0: 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
f9b0: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
f9c0: 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
f9d0: 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
f9e0: 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
f9f0: 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c  ctive) {....C_Cl
fa00: 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
fa10: 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
fa20: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
fa30: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28  t_all();...for (
fa40: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
fa50: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
fa60: 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
fa70: 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
fa80: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
fa90: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
faa0: 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b  ].pcsc_reader) {
fab0: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
fac0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
fad0: 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a 09 7d 0a  reader);...}..}.
fae0: 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  ..cackey_initial
faf0: 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b  ized = 0;...CACK
fb00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fb10: 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
fb20: 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
fb30: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
fb40: 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
fb50: 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
fb60: 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49   C_GetInfo)(CK_I
fb70: 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
fb80: 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
fb90: 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
fba0: 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
fbb0: 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
fbc0: 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c  ic CK_UTF8CHAR l
fbd0: 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
fbe0: 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a  n[] = "CACKey";.
fbf0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
fc00: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
fc10: 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
fc20: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
fc30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
fc40: 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
fc50: 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
fc60: 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
fc70: 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
fc80: 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
fc90: 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
fca0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
fcb0: 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
fcc0: 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
fcd0: 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
fce0: 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
fcf0: 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63  );..}...pInfo->c
fd00: 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d  ryptokiVersion.m
fd10: 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  ajor = ((CACKEY_
fd20: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
fd30: 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20  _CODE) >> 16) & 
fd40: 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72  0xff;..pInfo->cr
fd50: 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69  yptokiVersion.mi
fd60: 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  nor = ((CACKEY_C
fd70: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
fd80: 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78  CODE) >> 8) & 0x
fd90: 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ff;...memset(pIn
fda0: 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
fdb0: 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
fdc0: 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
fdd0: 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
fde0: 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
fdf0: 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
fe00: 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
fe10: 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
fe20: 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c   1);...pInfo->fl
fe30: 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65  ags = 0x00;...me
fe40: 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mset(pInfo->libr
fe50: 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
fe60: 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
fe70: 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
fe80: 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79  ption));..memcpy
fe90: 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
fea0: 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72  escription, libr
feb0: 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
fec0: 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65  sizeof(libraryDe
fed0: 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b  scription) - 1);
fee0: 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  ...pInfo->librar
fef0: 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  yVersion.major =
ff00: 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
ff10: 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
ff20: 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  xff;..pInfo->lib
ff30: 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  raryVersion.mino
ff40: 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
ff50: 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
ff60: 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f   0xff;...CACKEY_
ff70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
ff80: 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
ff90: 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
ffa0: 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
ffb0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73  .}../*. * Proces
ffc0: 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  s list of reader
ffd0: 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61  s, and create ma
ffe0: 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65  pping between re
fff0: 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c  ader name and sl
10000 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46  ot ID. */.CK_DEF
10010 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
10020 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73  RV, C_GetSlotLis
10030 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65  t)(CK_BBOOL toke
10040 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f  nPresent, CK_SLO
10050 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69  T_ID_PTR pSlotLi
10060 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
10070 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e   pulCount) {..in
10080 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
10090 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  .int pcsc_connec
100a0 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  t_ret;..CK_ULONG
100b0 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75   count, slot_cou
100c0 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74  nt = 0, currslot
100d0 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65  ;..char *pcsc_re
100e0 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61  aders, *pcsc_rea
100f0 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65  ders_s, *pcsc_re
10100 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20  aders_e;..DWORD 
10110 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
10120 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69  ;..LONG scard_li
10130 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09  streaders_ret;..
10140 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64  size_t curr_read
10150 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59  er_len;...CACKEY
10160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
10170 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
10180 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
10190 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
101a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
101b0 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55  . pulCount is NU
101c0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
101d0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
101e0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
101f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
10200 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
10210 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
10220 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
10230 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
10240 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
10250 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
10260 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
10270 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
10280 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
10290 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
102a0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
102b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
102c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
102d0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
102e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
102f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
10300 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20  ;..}.../* Clear 
10310 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f  list of slots */
10320 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29  ..if (pSlotList)
10330 20 7b 0a 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64   {.../* Only upd
10340 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ate the list of 
10350 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20  slots if we are 
10360 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73  actually being s
10370 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69  upply the slot i
10380 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09  nformation */...
10390 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
103a0 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
103b0 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
103c0 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  = 0; currslot < 
103d0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
103e0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
103f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
10400 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
10410 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
10420 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
10430 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09  sc_reader) {....
10440 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
10450 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
10460 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09  c_reader);......
10470 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
10480 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
10490 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 7d 0a  er = NULL;....}.
104a0 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
104b0 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
104c0 65 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  e = 0;...}..}...
104d0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6c 69 73  /* Determine lis
104e0 74 20 6f 66 20 72 65 61 64 65 72 73 20 2a 2f 0a  t of readers */.
104f0 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
10500 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
10510 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28  connect();..if (
10520 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
10530 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
10540 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
10550 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
10560 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
10570 53 43 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  SC failed, assum
10580 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a  ing no slots");.
10590 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  ...slot_count = 
105a0 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70  0;..} else {...p
105b0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20  csc_readers_len 
105c0 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69  = 0;....scard_li
105d0 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
105e0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
105f0 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
10600 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ndle, NULL, NULL
10610 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
10620 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73 63 61 72  len);...if (scar
10630 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
10640 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
10650 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61  CESS && pcsc_rea
10660 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  ders_len != 0) {
10670 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
10680 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72   = malloc(pcsc_r
10690 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
106a0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d  pcsc_readers_s =
106b0 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a   pcsc_readers;..
106c0 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
106d0 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
106e0 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
106f0 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
10700 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64   NULL, pcsc_read
10710 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ers, &pcsc_reade
10720 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  rs_len);....if (
10730 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
10740 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
10750 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
10760 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d  pcsc_readers_e =
10770 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20   pcsc_readers + 
10780 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
10790 3b 0a 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20  ;......currslot 
107a0 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c 65 20 28  = 0;.....while (
107b0 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70  pcsc_readers < p
107c0 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
107d0 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65  ......curr_reade
107e0 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70  r_len = strlen(p
107f0 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
10800 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65  ....if ((pcsc_re
10810 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61  aders + curr_rea
10820 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f  der_len) > pcsc_
10830 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09  readers_e) {....
10840 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
10850 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  .......if (curr_
10860 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29  reader_len == 0)
10870 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
10880 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
10890 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69  (currslot >= (si
108a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
108b0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
108c0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
108d0 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
108e0 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
108f0 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74  d more readers t
10900 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76  han slots are av
10910 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09  ailable!");.....
10920 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
10930 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
10940 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
10950 64 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70  d reader: %s", p
10960 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
10970 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61  ..../* Only upda
10980 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73  te the list of s
10990 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61  lots if we are a
109a0 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 75  ctually being su
109b0 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e  pply the slot in
109c0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09  formation */....
109d0 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29  ..if (pSlotList)
109e0 20 7b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f   {.......cackey_
109f0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
10a00 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09  active = 1;.....
10a10 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
10a20 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  urrslot].pcsc_re
10a30 61 64 65 72 20 3d 20 73 74 72 64 75 70 28 70 63  ader = strdup(pc
10a40 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09  sc_readers);....
10a50 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
10a60 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63  currslot].pcsc_c
10a70 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
10a80 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  0;.......cackey_
10a90 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
10aa0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
10ab0 68 20 3d 20 30 3b 0a 09 09 09 09 09 7d 0a 09 09  h = 0;......}...
10ac0 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
10ad0 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
10ae0 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
10af0 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
10b00 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
10b10 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  t > 0) {......sl
10b20 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72 73  ot_count = currs
10b30 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  lot;.....}....} 
10b40 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
10b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10b60 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53  Second call to S
10b70 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20  CardListReaders 
10b80 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25  failed, return %
10b90 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44  s/%li", CACKEY_D
10ba0 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
10bb0 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
10bc0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
10bd0 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c  , (long) scard_l
10be0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b  istreaders_ret);
10bf0 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70  ....}.....free(p
10c00 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a  csc_readers_s);.
10c10 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
10c20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10c30 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f  F("First call to
10c40 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
10c50 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
10c60 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
10c70 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
10c80 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
10c90 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
10ca0 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
10cb0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
10cc0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
10cd0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
10ce0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
10cf0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
10d00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
10d10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
10d20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10d30 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
10d40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
10d50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
10d60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
10d70 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  .if (pSlotList =
10d80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
10d90 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
10da0 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  nt;....CACKEY_DE
10db0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
10dc0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
10dd0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
10de0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
10df0 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75  .}...count = *pu
10e00 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75  lCount;..if (cou
10e10 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  nt < slot_count)
10e20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
10e30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
10e40 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20   User allocated 
10e50 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74  %lu entries, but
10e60 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74   we have %lu ent
10e70 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73  ries.", count, s
10e80 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  lot_count);....r
10e90 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
10ea0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
10eb0 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
10ec0 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
10ed0 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 72   slot_count; cur
10ee0 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 53 6c  rslot++) {...pSl
10ef0 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d  otList[currslot]
10f00 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 7d 0a   = currslot;..}.
10f10 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
10f20 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
10f30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10f40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
10f50 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
10f60 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
10f70 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65  K);...tokenPrese
10f80 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e  nt = tokenPresen
10f90 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  t; /* Supress un
10fa0 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
10fb0 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
10fc0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
10fd0 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49  K_RV, C_GetSlotI
10fe0 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
10ff0 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f  slotID, CK_SLOT_
11000 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
11010 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
11020 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69  8CHAR slotDescri
11030 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
11040 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75  y Slot";..int mu
11050 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
11060 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
11070 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11080 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
11090 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
110a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
110b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
110c0 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
110d0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
110e0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
110f0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
11100 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
11110 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
11120 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
11130 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
11140 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
11150 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
11160 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
11170 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
11180 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
11190 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
111a0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
111b0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
111c0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
111d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
111e0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
111f0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
11200 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
11210 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
11220 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
11230 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
11240 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
11250 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
11260 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
11270 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
11280 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
11290 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
112a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
112b0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
112c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
112d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
112e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
112f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
11300 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
11310 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11320 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11330 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
11340 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
11350 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
11360 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
11370 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
11380 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
11390 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
113a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
113b0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
113c0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
113d0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
113e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
113f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
11400 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
11410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11420 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
11430 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
11440 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
11450 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
11460 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
11470 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70  nfo->slotDescrip
11480 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f  tion, ' ', sizeo
11490 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  f(pInfo->slotDes
114a0 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
114b0 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  cpy(pInfo->slotD
114c0 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74  escription, slot
114d0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a  Description, siz
114e0 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74  eof(slotDescript
114f0 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  ion) - 1);...mem
11500 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  set(pInfo->manuf
11510 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20  acturerID, ' ', 
11520 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
11530 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a  nufacturerID));.
11540 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
11550 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f  = strlen(cackey_
11560 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63  slots[slotID].pc
11570 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20  sc_reader);..if 
11580 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d  (sizeof(pInfo->m
11590 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 3c  anufacturerID) <
115a0 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20   bytes_to_copy) 
115b0 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  {...bytes_to_cop
115c0 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  y = sizeof(pInfo
115d0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
115e0 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49  );..}..memcpy(pI
115f0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
11600 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  rID, cackey_slot
11610 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72  s[slotID].pcsc_r
11620 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f  eader, bytes_to_
11630 63 6f 70 79 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  copy);...pInfo->
11640 66 6c 61 67 73 20 3d 20 30 3b 0a 0a 09 69 66 20  flags = 0;...if 
11650 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
11660 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
11670 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d 20  ots[slotID]) == 
11680 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
11690 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
116a0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20  pInfo->flags |= 
116b0 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e  CKF_TOKEN_PRESEN
116c0 54 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 68  T;..}...pInfo->h
116d0 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
116e0 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  ajor = (cackey_g
116f0 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31  etversion() >> 1
11700 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
11710 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69  o->hardwareVersi
11720 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b  on.minor = (cack
11730 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
11740 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
11750 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
11760 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30  ersion.major = 0
11770 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  x00;..pInfo->fir
11780 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  mwareVersion.min
11790 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43  or = 0x00;...CAC
117a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
117b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
117c0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
117d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
117e0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
117f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
11800 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  , C_GetTokenInfo
11810 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
11820 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e  tID, CK_TOKEN_IN
11830 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
11840 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
11850 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72  HAR manufacturer
11860 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76  ID[] = "U.S. Gov
11870 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69  ernment";..stati
11880 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65  c CK_UTF8CHAR de
11890 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22  faultLabel[] = "
118a0 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a  Unknown Token";.
118b0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
118c0 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43  HAR model[] = "C
118d0 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 69 6e 74 20  AC Token";..int 
118e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
118f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11900 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
11910 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
11920 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
11930 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
11940 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
11950 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
11960 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
11970 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
11980 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
11990 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
119a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
119b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
119c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
119d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
119e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
119f0 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
11a00 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
11a10 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
11a20 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
11a30 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
11a40 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
11a50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
11a60 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
11a70 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
11a80 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
11a90 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
11aa0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
11ab0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
11ac0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
11ad0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
11ae0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
11af0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
11b00 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
11b10 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
11b20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11b30 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
11b40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
11b50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
11b60 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
11b70 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
11b80 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
11b90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
11ba0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
11bb0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
11bc0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
11bd0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
11be0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
11bf0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
11c00 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
11c10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
11c20 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
11c30 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
11c40 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
11c50 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
11c60 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
11c70 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
11c80 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
11c90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11ca0 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e  PRINTF("No token
11cb0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73   is present in s
11cc0 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c  lotID = %lu", sl
11cd0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
11ce0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
11cf0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
11d00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
11d10 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b  EN_NOT_PRESENT);
11d20 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
11d30 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
11d40 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
11d50 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
11d60 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
11d70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11d80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11d90 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
11da0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
11db0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
11dc0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65  ROR);..}...memse
11dd0 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  t(pInfo->label, 
11de0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
11df0 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 69 66 20  o->label));..if 
11e00 28 31 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70  (1) {...memcpy(p
11e10 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66  Info->label, def
11e20 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f  aultLabel, sizeo
11e30 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20  f(defaultLabel) 
11e40 2d 20 31 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  - 1);..} else {.
11e50 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
11e60 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
11e70 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
11e80 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
11e90 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
11ea0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
11eb0 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
11ec0 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
11ed0 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
11ee0 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
11ef0 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20  fo->model, ' ', 
11f00 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f  sizeof(pInfo->mo
11f10 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  del));..memcpy(p
11f20 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64  Info->model, mod
11f30 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c  el, sizeof(model
11f40 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
11f50 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75  (pInfo->serialNu
11f60 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f  mber, ' ', sizeo
11f70 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  f(pInfo->serialN
11f80 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65  umber));...memse
11f90 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  t(pInfo->utcTime
11fa0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
11fb0 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a  nfo->utcTime));.
11fc0 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
11fd0 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
11fe0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
11ff0 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
12000 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
12010 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
12020 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
12030 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
12040 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
12050 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
12060 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
12070 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
12080 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
12090 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c  x00;...pInfo->fl
120a0 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f  ags = CKF_WRITE_
120b0 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f  PROTECTED | CKF_
120c0 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c  USER_PIN_INITIAL
120d0 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e  IZED | CKF_TOKEN
120e0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43  _INITIALIZED | C
120f0 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
12100 44 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  D;...pInfo->ulMa
12110 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  xSessionCount = 
12120 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
12130 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
12140 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
12150 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e  s[0])) - 1;..pIn
12160 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75  fo->ulSessionCou
12170 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  nt = CK_UNAVAILA
12180 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
12190 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77  ..pInfo->ulMaxRw
121a0 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30  SessionCount = 0
121b0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65  ;..pInfo->ulRwSe
121c0 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f  ssionCount = CK_
121d0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
121e0 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
121f0 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31  >ulMaxPinLen = 1
12200 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69  28;..pInfo->ulMi
12210 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49  nPinLen = 0;..pI
12220 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c  nfo->ulTotalPubl
12230 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  icMemory = CK_UN
12240 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
12250 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
12260 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72  lFreePublicMemor
12270 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
12280 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
12290 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50  .pInfo->ulTotalP
122a0 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43  rivateMemory = C
122b0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
122c0 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
122d0 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65  o->ulFreePrivate
122e0 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
122f0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
12300 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ION;...CACKEY_DE
12310 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
12320 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
12330 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
12340 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
12350 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
12360 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61  TION(CK_RV, C_Wa
12370 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28  itForSlotEvent)(
12380 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20  CK_FLAGS flags, 
12390 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70  CK_SLOT_ID_PTR p
123a0 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f  SlotID, CK_VOID_
123b0 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b  PTR pReserved) {
123c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
123d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
123e0 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65  ;...if (pReserve
123f0 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d != NULL) {...C
12400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12410 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65  TF("Error. pRese
12420 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rved is not NULL
12430 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
12440 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
12450 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
12460 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
12470 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
12480 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12490 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
124a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
124b0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
124c0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
124d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
124e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
124f0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
12500 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
12510 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
12520 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
12530 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
12540 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
12550 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
12560 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
12570 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e  _RV, C_GetMechan
12580 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54  ismList)(CK_SLOT
12590 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d  _ID slotID, CK_M
125a0 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54  ECHANISM_TYPE_PT
125b0 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  R pMechanismList
125c0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
125d0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
125e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
125f0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
12600 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
12610 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
12620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12630 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
12640 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
12650 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
12660 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
12670 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
12680 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
12690 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
126a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
126b0 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c   pulCount is NUL
126c0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
126d0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
126e0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
126f0 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e  chanismList == N
12700 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
12710 6e 74 20 3d 20 33 3b 0a 0a 09 09 43 41 43 4b 45  nt = 3;....CACKE
12720 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12730 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
12740 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
12750 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
12760 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75  K);..}...if (*pu
12770 6c 43 6f 75 6e 74 20 3c 20 33 29 20 7b 0a 09 09  lCount < 3) {...
12780 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12790 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66  NTF("Error.  Buf
127a0 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29  fer too small.")
127b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
127c0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
127d0 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69  );..}...pMechani
127e0 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f  smList[0] = CKM_
127f0 52 53 41 5f 50 4b 43 53 3b 0a 09 70 4d 65 63 68  RSA_PKCS;..pMech
12800 61 6e 69 73 6d 4c 69 73 74 5b 31 5d 20 3d 20 43  anismList[1] = C
12810 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
12820 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 32  ;..*pulCount = 2
12830 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
12840 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
12850 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
12860 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
12870 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
12880 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
12890 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65  N(CK_RV, C_GetMe
128a0 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f  chanismInfo)(CK_
128b0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
128c0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50  CK_MECHANISM_TYP
128d0 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41  E type, CK_MECHA
128e0 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49  NISM_INFO_PTR pI
128f0 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  nfo) {..int mute
12900 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
12910 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12920 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
12930 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
12940 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
12950 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12960 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
12970 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
12980 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
12990 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
129a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
129b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
129c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
129d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
129e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
129f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
12a00 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
12a10 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
12a20 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
12a30 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
12a40 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
12a50 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
12a60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
12a70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
12a80 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
12a90 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
12aa0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
12ab0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
12ac0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
12ad0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
12ae0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
12af0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
12b00 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
12b10 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
12b20 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
12b30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12b40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
12b50 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
12b60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
12b70 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
12b80 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
12b90 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
12ba0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
12bb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12bc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
12bd0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
12be0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
12bf0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
12c00 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
12c10 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
12c20 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
12c30 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
12c40 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
12c50 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
12c60 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
12c70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
12c80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
12c90 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
12ca0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
12cb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12cc0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
12cd0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
12ce0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
12cf0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
12d00 09 2f 2a 20 58 58 58 3a 20 54 68 69 73 20 69 73  ./* XXX: This is
12d10 20 75 6e 74 65 73 74 65 64 2c 20 61 6e 64 20 66   untested, and f
12d20 75 72 74 68 65 72 20 49 27 6d 20 6e 6f 74 20 72  urther I'm not r
12d30 65 61 6c 6c 79 20 73 75 72 65 20 69 66 20 74 68  eally sure if th
12d40 69 73 20 69 73 20 63 6f 72 72 65 63 74 2e 20 2a  is is correct. *
12d50 2f 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 29  /..switch (type)
12d60 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
12d70 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f  A_PKCS:....pInfo
12d80 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d  ->ulMinKeySize =
12d90 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e   512;....pInfo->
12da0 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38  ulMaxKeySize = 8
12db0 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66  192;....pInfo->f
12dc0 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20  lags = CKF_HW | 
12dd0 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b  CKF_ENCRYPT | CK
12de0 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f  F_DECRYPT | CKF_
12df0 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46  SIGN | CKF_VERIF
12e00 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  Y;....break;...c
12e10 61 73 65 20 43 4b 4d 5f 52 53 41 5f 58 5f 35 30  ase CKM_RSA_X_50
12e20 39 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  9:....pInfo->ulM
12e30 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b  inKeySize = 512;
12e40 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ....pInfo->ulMax
12e50 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a  KeySize = 8192;.
12e60 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
12e70 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45  = CKF_HW | CKF_E
12e80 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43  NCRYPT | CKF_DEC
12e90 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20  RYPT | CKF_SIGN 
12ea0 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09  | CKF_VERIFY;...
12eb0 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
12ec0 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
12ed0 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69  :....pInfo->ulMi
12ee0 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a  nKeySize = 512;.
12ef0 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b  ...pInfo->ulMaxK
12f00 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09  eySize = 8192;..
12f10 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
12f20 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 53 49   CKF_HW | CKF_SI
12f30 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b  GN | CKF_VERIFY;
12f40 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
12f50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12f60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
12f70 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
12f80 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
12f90 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65  KR_OK);.}../* We
12fa0 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74   don't support t
12fb0 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43  his method. */.C
12fc0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
12fd0 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54  N(CK_RV, C_InitT
12fe0 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  oken)(CK_SLOT_ID
12ff0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38   slotID, CK_UTF8
13000 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
13010 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
13020 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
13030 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43  R pLabel) {..CAC
13040 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13050 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
13060 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
13070 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
13080 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13090 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
130a0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
130b0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
130c0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
130d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
130e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
130f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f  Returning CKR_TO
13100 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
13110 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54  TED (%i)", CKR_T
13120 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
13130 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  CTED);...return(
13140 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
13150 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f  PROTECTED);.}../
13160 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
13170 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
13180 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
13190 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
131a0 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49  nitPIN)(CK_SESSI
131b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
131c0 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  on, CK_UTF8CHAR_
131d0 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
131e0 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
131f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13200 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
13210 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
13220 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
13230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13240 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
13250 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
13260 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
13270 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
13280 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
13290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
132a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
132b0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
132c0 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b  TECTED (%i)", CK
132d0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
132e0 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75  OTECTED);...retu
132f0 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  rn(CKR_TOKEN_WRI
13300 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d  TE_PROTECTED);.}
13310 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
13320 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
13330 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
13340 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
13350 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53  C_SetPIN)(CK_SES
13360 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
13370 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  sion, CK_UTF8CHA
13380 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43  R_PTR pOldPin, C
13390 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e  K_ULONG ulOldPin
133a0 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  Len, CK_UTF8CHAR
133b0 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b  _PTR pNewPin, CK
133c0 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c  _ULONG ulNewPinL
133d0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
133e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
133f0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
13400 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
13410 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
13420 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
13430 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
13440 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
13450 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
13460 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
13470 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
13480 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
13490 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
134a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
134b0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
134c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
134d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
134e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
134f0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
13500 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
13510 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73  K_RV, C_OpenSess
13520 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ion)(CK_SLOT_ID 
13530 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53  slotID, CK_FLAGS
13540 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f   flags, CK_VOID_
13550 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  PTR pApplication
13560 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69  , CK_NOTIFY noti
13570 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  fy, CK_SESSION_H
13580 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73  ANDLE_PTR phSess
13590 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  ion) {..unsigned
135a0 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20   long idx;..int 
135b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
135c0 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e  nt found_session
135d0 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 0;...CACKEY_D
135e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
135f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66  led.");...if ((f
13600 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41  lags & CKF_SERIA
13610 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b  L_SESSION) != CK
13620 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e  F_SERIAL_SESSION
13630 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ) {...return(CKR
13640 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45  _SESSION_PARALLE
13650 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  L_NOT_SUPPORTED)
13660 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
13670 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
13680 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13690 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
136a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
136b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
136c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
136d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
136e0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
136f0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
13700 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
13710 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
13720 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
13730 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13740 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13750 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
13760 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
13770 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
13780 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
13790 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
137a0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
137b0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
137c0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
137d0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
137e0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
137f0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
13800 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13810 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
13820 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
13830 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
13840 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
13850 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
13860 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
13870 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
13880 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13890 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
138a0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
138b0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
138c0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
138d0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
138e0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
138f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
13900 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
13910 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
13920 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  VALID);..}.../* 
13930 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
13940 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79  card is actually
13950 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f   in the slot. */
13960 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b  ..if (cackey_tok
13970 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b  en_present(&cack
13980 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
13990 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  ) != CACKEY_PCSC
139a0 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
139b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
139c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
139d0 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65    Card not prese
139e0 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43  nt.  Returning C
139f0 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
13a00 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  D");....cackey_m
13a10 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
13a20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
13a30 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43  return(CKR_DEVIC
13a40 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a  E_REMOVED);..}..
13a50 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69  .for (idx = 1; i
13a60 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
13a70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
13a80 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
13a90 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
13aa0 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63  ++) {...if (!cac
13ab0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
13ac0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66  ].active) {....f
13ad0 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31  ound_session = 1
13ae0 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e  ;.....*phSession
13af0 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b   = idx;.....cack
13b00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
13b10 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09  .active = 1;....
13b20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
13b30 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c  idx].slotID = sl
13b40 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f  otID;....cackey_
13b50 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74  sessions[idx].st
13b60 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42  ate = CKS_RO_PUB
13b70 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09  LIC_SESSION;....
13b80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
13b90 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61  idx].flags = fla
13ba0 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  gs;....cackey_se
13bb0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65  ssions[idx].ulDe
13bc0 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09  viceError = 0;..
13bd0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
13be0 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74  s[idx].pApplicat
13bf0 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69  ion = pApplicati
13c00 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  on;....cackey_se
13c10 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69  ssions[idx].Noti
13c20 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09  fy = notify;....
13c30 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
13c40 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
13c50 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b   = NULL;....cack
13c60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
13c70 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
13c80 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  t = 0;.....cacke
13c90 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
13ca0 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20  search_active = 
13cb0 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  0;.....cackey_se
13cc0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e  ssions[idx].sign
13cd0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
13ce0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
13cf0 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63  [idx].decrypt_ac
13d00 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 62 72  tive = 0;.....br
13d10 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  eak;...}..}...mu
13d20 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
13d30 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
13d40 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
13d50 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
13d60 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
13d70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13d80 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
13d90 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
13da0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
13db0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
13dc0 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65  ...if (!found_se
13dd0 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45  ssion) {...CACKE
13de0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13df0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45  Returning CKR_SE
13e00 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29  SSION_COUNT (%i)
13e10 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ", CKR_SESSION_C
13e20 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e  OUNT);....return
13e30 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55  (CKR_SESSION_COU
13e40 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  NT);..}...CACKEY
13e50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13e60 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
13e70 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
13e80 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
13e90 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
13ea0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
13eb0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43  _CloseSession)(C
13ec0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
13ed0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b   hSession) {..CK
13ee0 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
13ef0 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _attr;..unsigned
13f00 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74   long id_idx, at
13f10 74 72 5f 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  tr_idx;..int mut
13f20 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
13f30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13f40 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
13f50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
13f60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
13f70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13f80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
13f90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
13fa0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
13fb0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
13fc0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
13fd0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
13fe0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
13ff0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
14000 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
14010 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
14020 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
14030 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14040 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
14050 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
14060 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
14070 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
14080 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
14090 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
140a0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
140b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
140c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
140d0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
140e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
140f0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
14100 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
14110 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
14120 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
14130 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
14140 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
14150 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
14160 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
14170 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
14180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14190 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
141a0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
141b0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
141c0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
141d0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
141e0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
141f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
14200 76 65 20 3d 20 30 3b 0a 09 69 66 20 28 63 61 63  ve = 0;..if (cac
14210 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
14220 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
14230 73 29 20 7b 0a 09 09 66 6f 72 20 28 69 64 5f 69  s) {...for (id_i
14240 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c  dx = 0; id_idx <
14250 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
14260 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
14270 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f  ities_count; id_
14280 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28  idx++) {....if (
14290 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
142a0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
142b0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
142c0 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66  ributes) {.....f
142d0 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30  or (attr_idx = 0
142e0 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63  ; attr_idx < cac
142f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
14300 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
14310 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
14320 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72  utes_count; attr
14330 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 09 63  _idx++) {......c
14340 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b  urr_attr = &cack
14350 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
14360 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
14370 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
14380 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  tes[attr_idx];..
14390 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  .....if (curr_at
143a0 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09  tr->pValue) {...
143b0 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74  ....free(curr_at
143c0 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09  tr->pValue);....
143d0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 66  ..}.....}......f
143e0 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
143f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
14400 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
14410 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09  .attributes);...
14420 09 7d 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63  .}...}....free(c
14430 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
14440 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
14450 69 65 73 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ies);..}...mutex
14460 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
14470 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
14480 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
14490 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
144a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
144b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
144c0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
144d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
144e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
144f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
14500 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14510 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
14520 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
14530 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
14540 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
14550 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
14560 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53  _RV, C_CloseAllS
14570 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54  essions)(CK_SLOT
14580 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75  _ID slotID) {..u
14590 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e  int32_t idx;..in
145a0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
145b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
145c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
145d0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
145e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
145f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14600 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
14610 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
14620 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
14630 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
14640 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
14650 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
14660 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
14670 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
14680 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
14690 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
146a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
146b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
146c0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
146d0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
146e0 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
146f0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
14700 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
14710 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
14720 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
14730 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
14740 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
14750 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
14760 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
14770 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14780 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
14790 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
147a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
147b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
147c0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
147d0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
147e0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
147f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14800 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
14810 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
14820 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
14830 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
14840 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
14850 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
14860 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
14870 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
14880 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
14890 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  ID);..}...for (i
148a0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
148b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
148c0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
148d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
148e0 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
148f0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
14900 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
14910 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
14920 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
14930 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44  slotID != slotID
14940 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  ) {.....continue
14950 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
14960 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
14970 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
14980 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
14990 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65  n(idx);....cacke
149a0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
149b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
149c0 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
149d0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
149e0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
149f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
14a00 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
14a10 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
14a20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
14a30 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
14a40 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
14a50 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
14a60 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
14a70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14a80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
14a90 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
14aa0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
14ab0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
14ac0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
14ad0 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66   C_GetSessionInf
14ae0 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  o)(CK_SESSION_HA
14af0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
14b00 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50  K_SESSION_INFO_P
14b10 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74  TR pInfo) {..int
14b20 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
14b30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14b40 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
14b50 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
14b60 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
14b70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
14b80 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
14b90 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
14ba0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
14bb0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
14bc0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
14bd0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
14be0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14bf0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
14c00 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
14c10 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
14c20 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
14c30 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
14c40 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
14c50 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
14c60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
14c70 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
14c80 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
14c90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
14ca0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
14cb0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
14cc0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
14cd0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
14ce0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
14cf0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
14d00 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
14d10 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
14d20 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
14d30 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
14d40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14d50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
14d60 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
14d70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
14d80 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
14d90 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
14da0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
14db0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
14dc0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
14dd0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
14de0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
14df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14e00 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
14e10 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
14e20 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
14e30 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
14e40 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49  NVALID);..}...pI
14e50 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61  nfo->slotID = ca
14e60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
14e70 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
14e80 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20  .pInfo->state = 
14e90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
14ea0 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b  hSession].state;
14eb0 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
14ec0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
14ed0 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73  [hSession].flags
14ee0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69  ;..pInfo->ulDevi
14ef0 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79  ceError = cackey
14f00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
14f10 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f  on].ulDeviceErro
14f20 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  r;...mutex_retva
14f30 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
14f40 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
14f50 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
14f60 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
14f70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14f80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14f90 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
14fa0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
14fb0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
14fc0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
14fd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14fe0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
14ff0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
15000 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
15010 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
15020 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
15030 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
15040 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
15050 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
15060 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65  CK_BYTE_PTR pOpe
15070 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f  rationState, CK_
15080 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65  ULONG_PTR pulOpe
15090 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20  rationStateLen) 
150a0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
150b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
150c0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
150d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
150e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
150f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
15100 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
15110 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15120 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
15130 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
15140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15150 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
15160 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
15170 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
15180 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
15190 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
151a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
151b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
151c0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
151d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
151e0 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  , C_SetOperation
151f0 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  State)(CK_SESSIO
15200 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
15210 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
15220 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20  OperationState, 
15230 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61  CK_ULONG ulOpera
15240 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b  tionStateLen, CK
15250 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
15260 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43  EncryptionKey, C
15270 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
15280 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b  hAuthenticationK
15290 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
152a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
152b0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
152c0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
152d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
152e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
152f0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
15300 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
15310 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
15320 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
15330 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
15340 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15350 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
15360 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
15370 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
15380 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
15390 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
153a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
153b0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
153c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
153d0 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43  K_RV, C_Login)(C
153e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
153f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53   hSession, CK_US
15400 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65  ER_TYPE userType
15410 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
15420 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
15430 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 69 6e   ulPinLen) {..in
15440 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
15450 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a  .int login_ret;.
15460 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15470 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
15480 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
15490 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
154a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
154b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
154c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
154d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
154e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
154f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
15500 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
15510 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
15520 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
15530 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
15540 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
15550 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
15560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15570 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
15580 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
15590 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
155a0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
155b0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
155c0 09 69 66 20 28 75 73 65 72 54 79 70 65 20 21 3d  .if (userType !=
155d0 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09 43   CKU_USER) {...C
155e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
155f0 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65 20 6f  TF("Error.  We o
15600 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53 45 52  nly support USER
15610 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f 72   mode, asked for
15620 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e   %lu mode.", (un
15630 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65  signed long) use
15640 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75 72 6e  rType)....return
15650 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f 49  (CKR_USER_TYPE_I
15660 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
15670 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
15680 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
15690 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
156a0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
156b0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
156c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
156d0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
156e0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
156f0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
15700 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
15710 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
15720 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
15730 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
15740 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
15750 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
15760 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15770 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
15780 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
15790 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
157a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
157b0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
157c0 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20  }...login_ret = 
157d0 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61  cackey_login(&ca
157e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65  ckey_slots[cacke
157f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
15800 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 70 50  ion].slotID], pP
15810 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 4e 55  in, ulPinLen, NU
15820 4c 4c 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f  LL);..if (login_
15830 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
15840 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63  SC_S_OK) {...cac
15850 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
15860 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
15870 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72  ;....if (login_r
15880 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
15890 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09  C_E_LOCKED) {...
158a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
158b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f  INTF("Error.  To
158c0 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29  ken is locked.")
158d0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
158e0 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  _PIN_LOCKED);...
158f0 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e  } else if (login
15900 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
15910 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a  CSC_E_BADPIN) {.
15920 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15930 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15940 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a  Invalid PIN.");.
15950 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
15960 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09  IN_INCORRECT);..
15970 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
15980 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15990 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  .  Unknown error
159a0 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63   returned from c
159b0 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25  ackey_login() (%
159c0 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b  i)", login_ret);
159d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
159e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
159f0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
15a00 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
15a10 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45  ate = CKS_RO_USE
15a20 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d  R_FUNCTIONS;...m
15a30 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
15a40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
15a50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
15a60 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
15a70 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
15a80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15a90 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
15aa0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
15ab0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
15ac0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
15ad0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
15ae0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
15af0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
15b00 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
15b10 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
15b20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
15b30 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75  N(CK_RV, C_Logou
15b40 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
15b50 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
15b60 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
15b70 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
15b80 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
15b90 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
15ba0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
15bb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15bc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
15bd0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
15be0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
15bf0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
15c00 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
15c10 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
15c20 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
15c30 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
15c40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
15c50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
15c60 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
15c70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15c80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
15c90 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
15ca0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
15cb0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
15cc0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
15cd0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
15ce0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
15cf0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
15d00 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
15d10 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
15d20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15d30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15d40 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
15d50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15d60 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
15d70 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
15d80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
15d90 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
15da0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
15db0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
15dc0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
15dd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
15de0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
15df0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
15e00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
15e10 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
15e20 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  LID);..}...cacke
15e30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
15e40 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  ion].state = CKS
15e50 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49  _RO_PUBLIC_SESSI
15e60 4f 4e 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ON;...mutex_retv
15e70 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
15e80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
15e90 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
15ea0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
15eb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15ec0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15ed0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
15ee0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
15ef0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
15f00 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
15f10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15f20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
15f30 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
15f40 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
15f50 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
15f60 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
15f70 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28  C_CreateObject)(
15f80 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
15f90 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41  E hSession, CK_A
15fa0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
15fb0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
15fc0 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
15fd0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
15fe0 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  hObject) {..CACK
15ff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16000 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
16010 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
16020 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
16030 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16040 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
16050 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
16060 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
16070 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
16080 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
16090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
160a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
160b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
160c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
160d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
160e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
160f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
16100 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
16110 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
16120 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70  ION(CK_RV, C_Cop
16130 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53  yObject)(CK_SESS
16140 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
16150 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
16160 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
16170 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
16180 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
16190 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
161a0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
161b0 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b  R phNewObject) {
161c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
161d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
161e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
161f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
16200 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16210 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
16220 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
16230 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
16240 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
16250 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
16260 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16270 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
16280 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
16290 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
162a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
162b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
162c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
162d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
162e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
162f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
16300 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74   C_DestroyObject
16310 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
16320 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
16330 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
16340 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45  Object) {..CACKE
16350 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16360 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
16370 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
16380 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
16390 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
163a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
163b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
163c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
163d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
163e0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
163f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
16400 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
16410 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
16420 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
16430 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
16440 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
16450 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
16460 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
16470 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
16480 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f  ON(CK_RV, C_GetO
16490 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45  bjectSize)(CK_SE
164a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
164b0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
164c0 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
164d0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
164e0 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59  lSize) {..CACKEY
164f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
16500 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
16510 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
16520 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
16530 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16540 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
16550 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
16560 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
16570 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
16580 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
16590 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
165a0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
165b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
165c0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
165d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
165e0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
165f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
16600 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
16610 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
16620 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74  N(CK_RV, C_GetAt
16630 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b  tributeValue)(CK
16640 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
16650 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
16660 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
16670 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ct, CK_ATTRIBUTE
16680 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
16690 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
166a0 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ) {..CK_ATTRIBUT
166b0 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73  E *curr_attr;..s
166c0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
166d0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b  ntity *identity;
166e0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
166f0 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74  identity_idx, at
16700 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74  tr_idx, sess_att
16710 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a  r_idx, num_ids;.
16720 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
16730 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  l;..CK_RV retval
16740 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56   = CKR_OK;..CK_V
16750 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a  OID_PTR pValue;.
16760 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75  .CK_ULONG ulValu
16770 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  eLen;...CACKEY_D
16780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
16790 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
167a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
167b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
167c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
167d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
167e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
167f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
16800 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
16810 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
16820 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
16830 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
16840 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
16850 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
16860 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
16870 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16880 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
16890 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
168a0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
168b0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
168c0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
168d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65  ;..}...if (hObje
168e0 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ct == 0) {...CAC
168f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16900 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74  ("Error.  Object
16910 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
16920 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
16930 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f  turn(CKR_OBJECT_
16940 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
16950 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e  ..}...if (ulCoun
16960 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  t == 0) {.../* S
16970 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66  hort circuit, if
16980 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65   zero objects we
16990 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74  re specified ret
169a0 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69  urn zero items i
169b0 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09  mmediately */...
169c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
169d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
169e0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
169f0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
16a00 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
16a10 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
16a20 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e   (pTemplate == N
16a30 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
16a40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16a50 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20  ror.  pTemplate 
16a60 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
16a70 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
16a80 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
16a90 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f  dentity_idx = hO
16aa0 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74  bject - 1;...mut
16ab0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
16ac0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
16ad0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
16ae0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
16af0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
16b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16b10 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
16b20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
16b30 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
16b40 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
16b50 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
16b60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
16b70 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
16b80 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
16b90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
16ba0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16bb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
16bc0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
16bd0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
16be0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
16bf0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
16c00 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63  ...num_ids = cac
16c10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
16c20 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
16c30 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69  s_count;...if (i
16c40 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e  dentity_idx >= n
16c50 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b  um_ids) {...cack
16c60 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
16c70 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
16c80 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16c90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16ca0 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f   Object handle o
16cb0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64  ut of range.  id
16cc0 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75  entity_idx = %lu
16cd0 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e  , num_ids = %lu.
16ce0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
16cf0 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c  g) identity_idx,
16d00 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16d10 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65   num_ids);....re
16d20 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f  turn(CKR_OBJECT_
16d30 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
16d40 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d  ..}...identity =
16d50 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
16d60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
16d70 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f  tities[identity_
16d80 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74  idx];...for (att
16d90 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f  r_idx = 0; attr_
16da0 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61  idx < ulCount; a
16db0 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63  ttr_idx++) {...c
16dc0 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d  urr_attr = &pTem
16dd0 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b  plate[attr_idx];
16de0 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
16df0 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  L;...ulValueLen 
16e00 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
16e10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16e20 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20  PRINTF("Looking 
16e30 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78  for attribute 0x
16e40 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a  %08lx (identity:
16e50 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  %lu) ...", (unsi
16e60 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
16e70 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73  attr->type, (uns
16e80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e  igned long) iden
16e90 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f  tity_idx);....fo
16ea0 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78  r (sess_attr_idx
16eb0 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f   = 0; sess_attr_
16ec0 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e  idx < identity->
16ed0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
16ee0 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b  ; sess_attr_idx+
16ef0 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e  +) {....if (iden
16f00 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
16f10 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
16f20 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74  type == curr_att
16f30 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43  r->type) {.....C
16f40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16f50 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69  TF(" ... found i
16f60 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20  t, pValue = %p, 
16f70 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75  ulValueLen = %lu
16f80 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74  ", identity->att
16f90 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
16fa0 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69  r_idx].pValue, i
16fb0 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
16fc0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
16fd0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
16fe0 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20  .........pValue 
16ff0 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  = identity->attr
17000 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
17010 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09  _idx].pValue;...
17020 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69  ..ulValueLen = i
17030 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
17040 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
17050 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09  x].ulValueLen;..
17060 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63  ..}...}....if (c
17070 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
17080 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09   && pValue) {...
17090 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e  .if (curr_attr->
170a0 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c  ulValueLen >= ul
170b0 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09  ValueLen) {.....
170c0 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72  memcpy(curr_attr
170d0 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65  ->pValue, pValue
170e0 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  , ulValueLen);..
170f0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75  ..} else {.....u
17100 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
17110 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72  LONG) -1;......r
17120 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
17130 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09  ER_TOO_SMALL;...
17140 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61  .}...}....curr_a
17150 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  ttr->ulValueLen 
17160 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d  = ulValueLen;..}
17170 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
17180 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
17190 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
171a0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
171b0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
171c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
171d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
171e0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
171f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
17200 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
17210 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76  );..}...if (retv
17220 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42  al == CKR_ATTRIB
17230 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  UTE_TYPE_INVALID
17240 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17250 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
17260 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55  ning CKR_ATTRIBU
17270 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20  TE_TYPE_INVALID 
17280 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74  (%i)", (int) ret
17290 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66  val);..} else if
172a0 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f   (retval == CKR_
172b0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
172c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
172d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
172e0 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f  ning CKR_BUFFER_
172f0 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c  TOO_SMALL (%i)",
17300 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
17310 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76  .} else if (retv
17320 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al == CKR_OK) {.
17330 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17340 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
17350 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28   CKR_OK (%i)", (
17360 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
17370 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59   else {...CACKEY
17380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17390 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69  eturning %i", (i
173a0 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a  nt) retval);..}.
173b0 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
173c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
173d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
173e0 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
173f0 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ue)(CK_SESSION_H
17400 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
17410 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
17420 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
17430 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
17440 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
17450 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45  lCount) {..CACKE
17460 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17470 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
17480 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
17490 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
174a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
174b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
174c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
174d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
174e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
174f0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
17500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17510 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
17520 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
17530 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
17540 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
17550 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
17560 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
17570 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
17580 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
17590 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
175a0 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f  ObjectsInit)(CK_
175b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
175c0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52  Session, CK_ATTR
175d0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
175e0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
175f0 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74  Count) {..struct
17600 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
17610 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
17620 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74 20  tities;..struct 
17630 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
17640 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  *identities;..un
17650 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
17660 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 72  ids, id_idx, cur
17670 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69  r_id_type;..unsi
17680 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
17690 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09  rts, cert_idx;..
176a0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
176b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
176c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
176d0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
176e0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
176f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17700 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
17710 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
17720 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
17730 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
17740 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
17750 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
17760 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
17770 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
17780 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
17790 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
177a0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[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 53 65 73 73  TF("Error.  Sess
177d0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
177e0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
177f0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
17800 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
17810 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
17820 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
17830 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
17840 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
17850 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
17860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17870 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
17880 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
17890 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
178a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
178b0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
178c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
178d0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
178e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
178f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
17900 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
17910 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17920 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
17930 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
17940 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
17950 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
17960 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
17970 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
17980 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
17990 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
179a0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
179b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
179c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
179d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
179e0 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63  earch already ac
179f0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
17a00 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
17a10 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
17a20 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
17a30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
17a40 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c  dentities == NUL
17a50 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e  L) {...pcsc_iden
17a60 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
17a70 72 65 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b  read_certs(&cack
17a80 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f  ey_slots[cackey_
17a90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
17aa0 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c  n].slotID], NULL
17ab0 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
17ac0 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69  .if (pcsc_identi
17ad0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
17ae0 09 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75  .../* Convert nu
17af0 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f  mber of Certs to
17b00 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
17b10 74 73 20 2a 2f 0a 09 09 09 6e 75 6d 5f 69 64 73  ts */....num_ids
17b20 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f   = (CKO_PRIVATE_
17b30 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46  KEY - CKO_CERTIF
17b40 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d  ICATE + 1) * num
17b50 5f 63 65 72 74 73 3b 0a 0a 09 09 09 69 64 65 6e  _certs;.....iden
17b60 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28  tities = malloc(
17b70 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66  num_ids * sizeof
17b80 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a  (*identities));.
17b90 0a 09 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a  ....id_idx = 0;.
17ba0 09 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78  ...for (cert_idx
17bb0 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c   = 0; cert_idx <
17bc0 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74   num_certs; cert
17bd0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 66 6f  _idx++) {.....fo
17be0 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20  r (curr_id_type 
17bf0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
17c00 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20  E; curr_id_type 
17c10 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  <= CKO_PRIVATE_K
17c20 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  EY; curr_id_type
17c30 2b 2b 29 20 7b 0a 09 09 09 09 09 69 64 65 6e 74  ++) {......ident
17c40 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
17c50 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
17c60 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
17c70 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26  (curr_id_type, &
17c80 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
17c90 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f  cert_idx], cert_
17ca0 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
17cb0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
17cc0 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  tes_count);.....
17cd0 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
17ce0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
17cf0 74 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tes == NULL) {..
17d00 09 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
17d10 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
17d20 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  es_count = 0;...
17d30 09 09 09 7d 0a 0a 09 09 09 09 09 69 64 5f 69 64  ...}.......id_id
17d40 78 2b 2b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  x++;.....}....}.
17d50 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
17d60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
17d70 65 6e 74 69 74 69 65 73 20 3d 20 69 64 65 6e 74  entities = ident
17d80 69 74 69 65 73 3b 0a 09 09 09 63 61 63 6b 65 79  ities;....cackey
17d90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
17da0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
17db0 6f 75 6e 74 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a  ount = num_ids;.
17dc0 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
17dd0 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74  certs(pcsc_ident
17de0 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73  ities, num_certs
17df0 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  , 1);...}..}...i
17e00 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20  f (pTemplate != 
17e10 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c  NULL) {...if (ul
17e20 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  Count != 0) {...
17e30 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
17e40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
17e50 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20  h_query_count = 
17e60 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b  ulCount;....cack
17e70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
17e80 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
17e90 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f  ry = malloc(ulCo
17ea0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54  unt * sizeof(*pT
17eb0 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d  emplate));.....m
17ec0 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
17ed0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
17ee0 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54  search_query, pT
17ef0 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74  emplate, ulCount
17f00 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70   * sizeof(*pTemp
17f10 6c 61 74 65 29 29 3b 0a 09 09 7d 20 65 6c 73 65  late));...} else
17f20 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73   {....cackey_ses
17f30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
17f40 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
17f50 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65  nt = 0;....cacke
17f60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
17f70 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
17f80 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d  y = NULL;...}..}
17f90 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c   else {...if (ul
17fa0 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  Count != 0) {...
17fb0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
17fc0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
17fd0 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  ock);.....CACKEY
17fe0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17ff0 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75  rror.  Search qu
18000 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61 73  ery specified as
18010 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65   NULL, but numbe
18020 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73  r of query terms
18030 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
18040 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  s 0.");.....retu
18050 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
18060 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _BAD);...}....ca
18070 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
18080 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
18090 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  uery_count = 0;.
180a0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
180b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
180c0 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b  ch_query = NULL;
180d0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
180e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
180f0 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20  search_active = 
18100 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  1;..cackey_sessi
18110 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
18120 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30  arch_curr_id = 0
18130 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
18140 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
18150 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
18160 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
18170 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
18180 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18190 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
181a0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
181b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
181c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
181d0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
181e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
181f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
18200 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
18210 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
18220 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
18230 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
18240 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f  FindObjects)(CK_
18250 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
18260 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
18270 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
18280 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Object, CK_ULONG
18290 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
182a0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
182b0 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20  pulObjectCount) 
182c0 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
182d0 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  _identity *curr_
182e0 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  id;..CK_ATTRIBUT
182f0 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43  E *curr_attr;..C
18300 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f  K_ULONG curr_id_
18310 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64  idx, curr_out_id
18320 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f  _idx, curr_attr_
18330 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69  idx, sess_attr_i
18340 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61  dx;..CK_ULONG ma
18350 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65  tched_count, pre
18360 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b  v_matched_count;
18370 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
18380 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
18390 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
183a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
183b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
183c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
183d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
183e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
183f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
18400 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
18410 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
18420 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63  }...if (pulObjec
18430 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  tCount == NULL) 
18440 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18450 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18460 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20   pulObjectCount 
18470 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
18480 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
18490 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
184a0 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
184b0 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  ULL && ulMaxObje
184c0 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
184d0 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
184e0 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65  it, if zero obje
184f0 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69  cts were specifi
18500 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  ed return zero i
18510 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  tems immediately
18520 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74   */...*pulObject
18530 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41  Count = 0;....CA
18540 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18550 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
18560 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
18570 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
18580 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
18590 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
185a0 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c  phObject == NULL
185b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
185c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
185d0 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e  .  phObject is N
185e0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
185f0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
18600 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
18610 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
18620 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
18630 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18640 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e  rror.  Maximum n
18650 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
18660 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65   specified as ze
18670 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ro.");....return
18680 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
18690 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  AD);..}...if (hS
186a0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
186b0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
186c0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
186d0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
186e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
186f0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
18700 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18710 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
18720 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
18730 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
18740 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
18750 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
18760 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
18770 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
18780 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
18790 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
187a0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
187b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
187c0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
187d0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
187e0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
187f0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
18800 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
18810 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
18820 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
18830 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
18840 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
18850 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18860 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
18870 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
18880 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
18890 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
188a0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
188b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
188c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
188d0 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
188e0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
188f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
18900 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
18910 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18920 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
18930 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
18940 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
18950 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
18960 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63  IALIZED);..}...c
18970 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a  urr_id_idx = 0;.
18980 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
18990 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
189a0 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79  _id_idx = cackey
189b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
189c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
189d0 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20  id; curr_id_idx 
189e0 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
189f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
18a00 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20  tities_count && 
18a10 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
18a20 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29  ; curr_id_idx++)
18a30 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26   {...curr_id = &
18a40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18a50 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
18a60 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78  ties[curr_id_idx
18a70 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ];....CACKEY_DEB
18a80 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65  UG_PRINTF("Proce
18a90 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  ssing identity:%
18aa0 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
18ab0 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78  ong) curr_id_idx
18ac0 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f  );....matched_co
18ad0 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20  unt = 0;....for 
18ae0 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d  (curr_attr_idx =
18af0 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64   0; curr_attr_id
18b00 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
18b10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
18b20 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
18b30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b  ; curr_attr_idx+
18b40 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74  +) {....prev_mat
18b50 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74  ched_count = mat
18b60 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09  ched_count;.....
18b70 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63  curr_attr = &cac
18b80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
18b90 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
18ba0 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64  ery[curr_attr_id
18bb0 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  x];.....CACKEY_D
18bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43  EBUG_PRINTF("  C
18bd0 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  hecking for attr
18be0 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 69 6e  ibute 0x%08lx in
18bf0 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22   identity:%i..."
18c00 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18c10 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  ) curr_attr->typ
18c20 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  e, (int) curr_id
18c30 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59  _idx);....CACKEY
18c40 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
18c50 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69  "    Value looki
18c60 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61  ng for:", curr_a
18c70 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72  ttr->pValue, cur
18c80 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
18c90 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65  en);.....for (se
18ca0 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
18cb0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
18cc0 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
18cd0 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73  utes_count; sess
18ce0 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
18cf0 09 09 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e  ...if (curr_id->
18d00 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
18d10 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d  attr_idx].type =
18d20 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  = curr_attr->typ
18d30 65 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  e) {......CACKEY
18d40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18d50 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74     ... found mat
18d60 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29  ching type ...")
18d70 3b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
18d80 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
18d90 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a    ... our value:
18da0 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  ", curr_id->attr
18db0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
18dc0 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75  _idx].pValue, cu
18dd0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
18de0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
18df0 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  .ulValueLen);...
18e00 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
18e10 72 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c  r->pValue == NUL
18e20 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  L) {.......CACKE
18e30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18e40 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
18e50 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22   wildcard match"
18e60 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68 65  );........matche
18e70 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09  d_count++;......
18e80 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
18e90 0a 20 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  . .....if (curr_
18ea0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
18eb0 20 3d 3d 20 63 75 72 72 5f 69 64 2d 3e 61 74 74   == curr_id->att
18ec0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
18ed0 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  r_idx].ulValueLe
18ee0 6e 20 26 26 20 6d 65 6d 63 6d 70 28 63 75 72 72  n && memcmp(curr
18ef0 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
18f00 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
18f10 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
18f20 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69  ].pValue, curr_i
18f30 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
18f40 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
18f50 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b  alueLen) == 0) {
18f60 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
18f70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
18f80 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61     ... found exa
18f90 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09  ct match");.....
18fa0 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ...matched_count
18fb0 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ++;........break
18fc0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
18fd0 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68  ..}...../* If th
18fe0 65 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c  e attribute coul
18ff0 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64  d not be matched
19000 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  , do not try to 
19010 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c  match additional
19020 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09   attributes */..
19030 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68  ..if (prev_match
19040 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63  ed_count == matc
19050 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  hed_count) {....
19060 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
19070 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f  ....if (matched_
19080 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f  count == cackey_
19090 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
190a0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
190b0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
190c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
190d0 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74  "  ... All %i at
190e0 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64  tributes checked
190f0 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69   for found, addi
19100 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74  ng identity:%i t
19110 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22  o returned list"
19120 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73  , (int) cackey_s
19130 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
19140 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
19150 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72  ount, (int) curr
19160 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68  _id_idx);.....ph
19170 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f  Object[curr_out_
19180 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69  id_idx] = curr_i
19190 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75  d_idx + 1;.....u
191a0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d  lMaxObjectCount-
191b0 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f  -;.....curr_out_
191c0 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c  id_idx++;...} el
191d0 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
191e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
191f0 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f  .. Not all %i (o
19200 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74  nly found %i) at
19210 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64  tributes checked
19220 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20   for found, not 
19230 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a  adding identity:
19240 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65  %i", (int) cacke
19250 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19260 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
19270 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d  y_count, (int) m
19280 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69  atched_count, (i
19290 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
192a0 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79  ;...}..}..cackey
192b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
192c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
192d0 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78  id = curr_id_idx
192e0 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  ;..*pulObjectCou
192f0 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64  nt = curr_out_id
19300 5f 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  _idx;...mutex_re
19310 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
19320 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
19330 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
19340 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
19350 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
19360 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19370 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
19380 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
19390 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
193a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
193b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
193c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
193d0 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a  OK (%i), num obj
193e0 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52  ects = %lu", CKR
193f0 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43  _OK, *pulObjectC
19400 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ount);...return(
19410 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
19420 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
19430 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
19440 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ctsFinal)(CK_SES
19450 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
19460 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  sion) {..int mut
19470 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
19480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19490 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
194a0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
194b0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
194c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
194d0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
194e0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
194f0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
19500 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
19510 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
19520 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
19530 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
19540 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
19550 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
19560 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
19570 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
19580 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19590 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
195a0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
195b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
195c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
195d0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
195e0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
195f0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
19600 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
19610 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
19620 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
19630 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19640 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
19650 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
19660 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
19670 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
19680 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
19690 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
196a0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
196b0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
196c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
196d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
196e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
196f0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
19700 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
19710 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
19720 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
19730 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
19740 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
19750 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
19760 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
19770 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
19780 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
19790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
197a0 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
197b0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
197c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
197d0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
197e0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
197f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19800 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
19810 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 69 66  _active = 0;..if
19820 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
19830 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
19840 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72  ch_query) {...fr
19850 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
19860 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
19870 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a  rch_query);..}..
19880 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
19890 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
198a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
198b0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
198c0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
198d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
198e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
198f0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
19900 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
19910 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
19920 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
19930 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
19940 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
19950 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
19960 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
19970 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
19980 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
19990 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  ryptInit)(CK_SES
199a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
199b0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
199c0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
199d0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
199e0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
199f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19a00 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
19a10 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
19a20 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
19a30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19a40 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
19a50 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
19a60 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
19a70 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
19a80 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
19a90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19aa0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
19ab0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
19ac0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
19ad0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
19ae0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
19af0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
19b00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
19b10 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
19b20 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
19b30 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f  crypt)(CK_SESSIO
19b40 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
19b50 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
19b60 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
19b70 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
19b80 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
19b90 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
19ba0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44  TR pulEncryptedD
19bb0 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
19bc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19bd0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
19be0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
19bf0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
19c00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19c10 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
19c20 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
19c30 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
19c40 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
19c50 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
19c60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19c70 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
19c80 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
19c90 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
19ca0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
19cb0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
19cc0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
19cd0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
19ce0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
19cf0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
19d00 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
19d10 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
19d20 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
19d30 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
19d40 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
19d50 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
19d60 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
19d70 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
19d80 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
19d90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19da0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
19db0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
19dc0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
19dd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19de0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
19df0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
19e00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
19e10 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
19e20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
19e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19e40 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
19e50 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
19e60 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
19e70 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
19e80 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
19e90 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
19ea0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
19eb0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
19ec0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
19ed0 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  EncryptFinal)(CK
19ee0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
19ef0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
19f00 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79  E_PTR pLastEncry
19f10 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
19f20 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e  NG_PTR pulLastEn
19f30 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
19f40 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
19f50 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
19f60 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
19f70 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
19f80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19f90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
19fa0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
19fb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
19fc0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
19fd0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
19fe0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19ff0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1a000 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1a010 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1a020 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1a030 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1a040 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1a050 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1a060 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1a070 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1a080 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29  , C_DecryptInit)
1a090 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1a0a0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1a0b0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
1a0c0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
1a0d0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
1a0e0 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
1a0f0 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a  tval;...hKey--;.
1a100 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a110 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1a120 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1a130 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1a140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a150 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1a160 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1a170 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1a180 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1a190 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1a1a0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d  if (pMechanism =
1a1b0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1a1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a1d0 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
1a1e0 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  sm is NULL.");..
1a1f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1a200 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1a210 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
1a220 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43  ->mechanism != C
1a230 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09  KM_RSA_PKCS) {..
1a240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a250 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
1a260 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
1a270 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  sm not specified
1a280 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   as CKM_RSA_PKCS
1a290 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a2a0 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41  R_MECHANISM_PARA
1a2b0 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  M_INVALID);..}..
1a2c0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1a2d0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1a2e0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1a2f0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1a300 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1a310 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1a320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a330 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1a340 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1a350 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1a360 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1a370 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1a380 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1a390 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1a3a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1a3b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1a3c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1a3d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a3e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1a3f0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1a400 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1a410 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1a420 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1a430 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1a440 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1a450 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1a460 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1a470 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1a480 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a490 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1a4a0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1a4b0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1a4c0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1a4d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1a4e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a4f0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
1a500 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1a510 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1a520 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1a530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a540 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
1a550 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69  ecrypt already i
1a560 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
1a570 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1a580 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
1a590 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
1a5a0 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
1a5b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
1a5c0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
1a5d0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1a5e0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1a5f0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1a600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a610 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
1a620 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
1a630 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a640 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56  R_KEY_HANDLE_INV
1a650 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
1a660 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a670 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
1a680 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b  tive = 1;...cack
1a690 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a6a0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
1a6b0 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61  chanism = pMecha
1a6c0 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b  nism->mechanism;
1a6d0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1a6e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
1a6f0 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20  ypt_mech_parm = 
1a700 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72  pMechanism->pPar
1a710 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f  ameter;..cackey_
1a720 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1a730 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
1a740 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61  parmlen = pMecha
1a750 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65  nism->ulParamete
1a760 72 4c 65 6e 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  rLen;...mutex_re
1a770 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1a780 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1a790 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1a7a0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1a7b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1a7c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a7d0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1a7e0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1a7f0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1a800 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1a810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a820 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1a830 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1a840 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1a850 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1a860 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1a870 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f  , C_Decrypt)(CK_
1a880 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1a890 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1a8a0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
1a8b0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
1a8c0 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
1a8d0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
1a8e0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
1a8f0 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a  R pulDataLen) {.
1a900 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65  .CK_ULONG datale
1a910 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65  n_update, datale
1a920 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20  n_final;..CK_RV 
1a930 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a 09 43  decrypt_ret;...C
1a940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a950 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1a960 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1a970 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1a980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a990 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1a9a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1a9b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1a9c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1a9d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1a9e0 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e  (pulDataLen == N
1a9f0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1aa00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1aa10 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20  ror. pulDataLen 
1aa20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1aa30 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1aa40 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64  NTS_BAD);..}...d
1aa50 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20  atalen_update = 
1aa60 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64  *pulDataLen;...d
1aa70 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44  ecrypt_ret = C_D
1aa80 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65  ecryptUpdate(hSe
1aa90 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65  ssion, pEncrypte
1aaa0 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74  dData, ulEncrypt
1aab0 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61  edDataLen, pData
1aac0 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  , &datalen_updat
1aad0 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74  e);..if (decrypt
1aae0 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
1aaf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ab00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ab10 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29   DecryptUpdate()
1ab20 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
1ab30 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
1ab40 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1ab50 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
1ab60 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
1ab70 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
1ab80 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20  Data) {...pData 
1ab90 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  += datalen_updat
1aba0 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66  e;..}..datalen_f
1abb0 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c  inal = *pulDataL
1abc0 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64  en - datalen_upd
1abd0 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72  ate;...decrypt_r
1abe0 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69  et = C_DecryptFi
1abf0 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  nal(hSession, pD
1ac00 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69  ata, &datalen_fi
1ac10 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79  nal);..if (decry
1ac20 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
1ac30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ac40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ac50 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28  .  DecryptFinal(
1ac60 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
1ac70 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
1ac80 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1ac90 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
1aca0 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
1acb0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  _ret);..}...*pul
1acc0 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65  DataLen = datale
1acd0 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c  n_update + datal
1ace0 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b  en_final;...CACK
1acf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ad00 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1ad10 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1ad20 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1ad30 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1ad40 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1ad50 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
1ad60 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1ad70 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1ad80 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
1ad90 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
1ada0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
1adb0 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
1adc0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
1add0 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
1ade0 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  n) {..static CK_
1adf0 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b  BYTE buf[16384];
1ae00 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  ..ssize_t buflen
1ae10 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
1ae20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
1ae30 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ROR;..int mutex_
1ae40 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1ae50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1ae60 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1ae70 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1ae80 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1ae90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1aea0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1aeb0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1aec0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1aed0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1aee0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1aef0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1af00 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1af10 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1af20 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1af30 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1af40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1af50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1af60 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1af70 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1af80 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1af90 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1afa0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e  D);..}...if (pEn
1afb0 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e  cryptedPart == N
1afc0 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74  ULL && ulEncrypt
1afd0 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  edPartLen == 0) 
1afe0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
1aff0 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61  cuit if we are a
1b000 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20  sked to decrypt 
1b010 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
1b020 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b030 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1b040 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
1b050 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
1b060 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
1b070 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
1b080 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
1b090 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1b0a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b0b0 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79  F("Error. pEncry
1b0c0 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c  ptedPart is NULL
1b0d0 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65  , but ulEncrypte
1b0e0 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  dPartLen is not 
1b0f0 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
1b100 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1b110 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45  D);..}...if (ulE
1b120 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
1b130 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1b140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b150 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65  rror. ulEncrypte
1b160 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62  dPartLen is 0, b
1b170 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20  ut pPart is not 
1b180 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1b190 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1b1a0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1b1b0 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  pulPartLen == NU
1b1c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1b1d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b1e0 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69  or. pulPartLen i
1b1f0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1b200 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1b210 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
1b220 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1b230 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1b240 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1b250 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1b260 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1b270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b280 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1b290 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1b2a0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1b2b0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1b2c0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1b2d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1b2e0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1b2f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1b300 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1b310 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b320 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1b330 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1b340 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1b350 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1b360 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1b370 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1b380 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1b390 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
1b3a0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1b3b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1b3c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1b3d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b3e0 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
1b3f0 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
1b400 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1b410 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
1b420 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1b430 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b  }...switch (cack
1b440 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1b450 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
1b460 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
1b470 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
1b480 09 09 09 62 75 66 6c 65 6e 20 3d 20 2d 31 3b 0a  ...buflen = -1;.
1b490 0a 09 09 09 2f 2a 20 58 58 58 3a 20 41 73 6b 20  ..../* XXX: Ask 
1b4a0 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74 20  card to decrypt 
1b4b0 2a 2f 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65  */.....if (bufle
1b4c0 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
1b4d0 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65  Decryption faile
1b4e0 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c  d. */.....retval
1b4f0 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
1b500 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65 20  RROR;....} else 
1b510 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
1b520 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a  ong) buflen) > *
1b530 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50  pulPartLen && pP
1b540 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65  art) {...../* De
1b550 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f  crypted data too
1b560 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65   large */.....re
1b570 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
1b580 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
1b590 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20  } else {.....if 
1b5a0 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d  (pPart) {......m
1b5b0 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66  emcpy(pPart, buf
1b5c0 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d  , buflen);.....}
1b5d0 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65  ......*pulPartLe
1b5e0 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09  n = buflen;.....
1b5f0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b  .retval = CKR_OK
1b600 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b  ;....}.....break
1b610 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1b620 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1b630 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1b640 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1b650 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1b660 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1b670 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b680 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1b690 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1b6a0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1b6b0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1b6c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b6d0 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
1b6e0 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a  (int) retval);..
1b6f0 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1b700 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1b710 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1b720 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  DecryptFinal)(CK
1b730 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1b740 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1b750 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c  E_PTR pLastPart,
1b760 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1b770 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a  lLastPartLen) {.
1b780 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1b790 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  l;..int terminat
1b7a0 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a  e_decrypt = 1;..
1b7b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b7c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1b7d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1b7e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1b7f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b800 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1b810 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1b820 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1b830 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1b840 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1b850 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
1b860 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
1b870 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1b880 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1b890 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1b8a0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1b8b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b8c0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1b8d0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
1b8e0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1b8f0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1b900 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1b910 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c  if (pulLastPartL
1b920 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
1b930 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b940 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c  NTF("Error. pulL
1b950 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55  astPartLen is NU
1b960 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1b970 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1b980 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
1b990 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1b9a0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1b9b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1b9c0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1b9d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1b9e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b9f0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1ba00 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1ba10 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1ba20 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1ba30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ba40 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1ba50 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1ba60 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ba70 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1ba80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ba90 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1baa0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1bab0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1bac0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1bad0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1bae0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1baf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
1bb00 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
1bb10 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1bb20 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1bb30 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1bb40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bb50 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
1bb60 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1bb70 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1bb80 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
1bb90 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1bba0 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  *pulLastPartLen 
1bbb0 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74  = 0;...if (pLast
1bbc0 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
1bbd0 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72  ..terminate_decr
1bbe0 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ypt = 0;..}...if
1bbf0 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72   (terminate_decr
1bc00 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ypt) {...cackey_
1bc10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1bc20 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
1bc30 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65  e = 0;..}...mute
1bc40 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1bc50 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1bc60 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1bc70 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1bc80 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1bc90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bca0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1bcb0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1bcc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1bcd0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1bce0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bcf0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1bd00 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1bd10 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1bd20 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1bd30 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1bd40 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e  K_RV, C_DigestIn
1bd50 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
1bd60 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1bd70 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
1bd80 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09   pMechanism) {..
1bd90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bda0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1bdb0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1bdc0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1bdd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bde0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1bdf0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1be00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1be10 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1be20 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1be30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1be40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1be50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1be60 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1be70 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1be80 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1be90 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1bea0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1beb0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1bec0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1bed0 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53  _Digest)(CK_SESS
1bee0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1bef0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1bf00 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
1bf10 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
1bf20 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
1bf30 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1bf40 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
1bf50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bf60 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1bf70 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1bf80 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1bf90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bfa0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1bfb0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1bfc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1bfd0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1bfe0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1bff0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c000 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1c010 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1c020 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1c030 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1c040 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1c050 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1c060 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1c070 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1c080 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1c090 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b  DigestUpdate)(CK
1c0a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1c0b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1c0c0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
1c0d0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
1c0e0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1c0f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1c100 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1c110 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1c120 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c130 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c140 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1c150 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c160 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1c170 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1c180 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c190 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1c1a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1c1b0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1c1c0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1c1d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1c1e0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1c1f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1c200 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1c210 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1c220 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28  V, C_DigestKey)(
1c230 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1c240 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
1c250 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
1c260 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
1c270 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1c280 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1c290 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1c2a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c2b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c2c0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1c2d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1c2e0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1c2f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1c300 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1c310 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1c320 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1c330 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1c340 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1c350 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1c360 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1c370 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1c380 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1c390 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1c3a0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e  _RV, C_DigestFin
1c3b0 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
1c3c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1c3d0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67  CK_BYTE_PTR pDig
1c3e0 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  est, CK_ULONG_PT
1c3f0 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20  R pulDigestLen) 
1c400 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1c410 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1c420 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1c430 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1c440 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c450 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1c460 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1c470 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c480 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1c490 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1c4a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c4b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1c4c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1c4d0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1c4e0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1c4f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1c500 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1c510 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1c520 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1c530 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1c540 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b  , C_SignInit)(CK
1c550 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1c560 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
1c570 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
1c580 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
1c590 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
1c5a0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1c5b0 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43  l;...hKey--;...C
1c5c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c5d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c5e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1c5f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1c600 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c610 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1c620 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1c630 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1c640 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1c650 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1c660 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e  (pMechanism == N
1c670 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1c680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c690 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20  ror. pMechanism 
1c6a0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1c6b0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1c6c0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1c6d0 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  f (pMechanism->m
1c6e0 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
1c6f0 52 53 41 5f 50 4b 43 53 20 26 26 20 70 4d 65 63  RSA_PKCS && pMec
1c700 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
1c710 6d 20 21 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53  m != CKM_SHA1_RS
1c720 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b  A_PKCS) {...CACK
1c730 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c740 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
1c750 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f  sm->mechanism no
1c760 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43  t specified as C
1c770 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 6f 72 20 43  KM_RSA_PKCS or C
1c780 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
1c790 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c7a0 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41  R_MECHANISM_PARA
1c7b0 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  M_INVALID);..}..
1c7c0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1c7d0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1c7e0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1c7f0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1c800 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1c810 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1c820 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c830 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1c840 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1c850 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1c860 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1c870 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1c880 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1c890 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1c8a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1c8b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1c8c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1c8d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c8e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1c8f0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1c900 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1c910 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1c920 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1c930 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c940 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1c950 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1c960 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1c970 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1c980 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c990 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1c9a0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1c9b0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1c9c0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1c9d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1c9e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1c9f0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
1ca00 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1ca10 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ca20 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1ca30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ca40 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
1ca50 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67   already in prog
1ca60 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ress.");......re
1ca70 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
1ca80 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
1ca90 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63  .if (hKey >= cac
1caa0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1cab0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
1cac0 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63  s_count) {...cac
1cad0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1cae0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1caf0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1cb00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1cb10 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74    Key handle out
1cb20 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 0a 09   of range.");...
1cb30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f  .return(CKR_KEY_
1cb40 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1cb50 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
1cb60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1cb70 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b  sign_active = 1;
1cb80 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1cb90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1cba0 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d  n_mechanism = pM
1cbb0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
1cbc0 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ism;...cackey_se
1cbd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1cbe0 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31  .sign_buflen = 1
1cbf0 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  28;..cackey_sess
1cc00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1cc10 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b  ign_bufused = 0;
1cc20 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1cc30 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
1cc40 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  _buf = malloc(si
1cc50 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
1cc60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1cc70 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
1cc80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1cc90 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
1cca0 6e 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  n);...mutex_retv
1ccb0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1ccc0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1ccd0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1cce0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1ccf0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1cd00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1cd10 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1cd20 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1cd30 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1cd40 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
1cd50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cd60 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1cd70 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1cd80 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1cd90 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1cda0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1cdb0 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 49  C_Sign)(CK_SESSI
1cdc0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1cdd0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1cde0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
1cdf0 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
1ce00 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
1ce10 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
1ce20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
1ce30 20 7b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72   {..CK_RV sign_r
1ce40 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
1ce50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1ce60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1ce70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1ce80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ce90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1cea0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1ceb0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1cec0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1ced0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1cee0 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43  }...sign_ret = C
1cef0 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 73  _SignUpdate(hSes
1cf00 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44  sion, pData, ulD
1cf10 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ataLen);..if (si
1cf20 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
1cf30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1cf40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1cf50 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20  .  SignUpdate() 
1cf60 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
1cf70 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
1cf80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
1cf90 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ign_ret);....ret
1cfa0 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09  urn(sign_ret);..
1cfb0 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43  }...sign_ret = C
1cfc0 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73  _SignFinal(hSess
1cfd0 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c  ion, pSignature,
1cfe0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
1cff0 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74  );..if (sign_ret
1d000 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
1d010 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d020 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
1d030 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65  nFinal() returne
1d040 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
1d050 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
1d060 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
1d070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  );....return(sig
1d080 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43  n_ret);..}...CAC
1d090 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d0a0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1d0b0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1d0c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1d0d0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1d0e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1d0f0 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28  , C_SignUpdate)(
1d100 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1d110 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1d120 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
1d130 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
1d140 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
1d150 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1d160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1d170 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1d180 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1d190 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1d1a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d1b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1d1c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1d1d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1d1e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1d1f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1d200 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1d210 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1d220 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1d230 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1d240 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1d250 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d260 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d270 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1d280 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1d290 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1d2a0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1d2b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61  D);..}...if (pPa
1d2c0 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c  rt == NULL && ul
1d2d0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
1d2e0 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
1d2f0 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b  it if we are ask
1d300 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69  ed to sign nothi
1d310 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45  ng... */...CACKE
1d320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d330 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1d340 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
1d350 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
1d360 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1d370 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61  K);..}...if (pPa
1d380 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
1d390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d3a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72  NTF("Error. pPar
1d3b0 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75  t is NULL, but u
1d3c0 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  lPartLen is not 
1d3d0 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
1d3e0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1d3f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50  D);..}...if (ulP
1d400 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
1d410 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d420 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50  INTF("Error. ulP
1d430 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74  artLen is 0, but
1d440 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55   pPart is not NU
1d450 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1d460 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1d470 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
1d480 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1d490 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1d4a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1d4b0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1d4c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1d4d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d4e0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1d4f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1d500 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1d510 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1d520 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d530 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1d540 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1d550 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1d560 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1d570 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d580 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1d590 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1d5a0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1d5b0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1d5c0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1d5d0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1d5e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1d5f0 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
1d600 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1d610 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1d620 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1d630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d640 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
1d650 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1d660 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
1d670 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
1d680 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  ED);..}...switch
1d690 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
1d6a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
1d6b0 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
1d6c0 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
1d6d0 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c  S:..../* Accumul
1d6e0 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ate directly */.
1d6f0 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73  ...if ((cackey_s
1d700 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d710 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
1d720 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61   ulPartLen) > ca
1d730 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1d740 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
1d750 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  len) {.....cacke
1d760 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1d770 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
1d780 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b   *= 2;......cack
1d790 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d7a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
1d7b0 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f   realloc(cackey_
1d7c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d7d0 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a  n].sign_buf, siz
1d7e0 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
1d7f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1d800 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
1d810 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1d820 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
1d830 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
1d840 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
1d850 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1d860 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73  n_buf + cackey_s
1d870 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1d880 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20  ].sign_bufused, 
1d890 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e  pPart, ulPartLen
1d8a0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  );.....cackey_se
1d8b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1d8c0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d  .sign_bufused +=
1d8d0 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09   ulPartLen;.....
1d8e0 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b  break;...case CK
1d8f0 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a  M_SHA1_RSA_PKCS:
1d900 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74  ..../* Accumulat
1d910 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61  e into a SHA1 ha
1d920 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  sh */....cackey_
1d930 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1d940 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1d950 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d960 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1d970 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1d980 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1d990 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1d9a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1d9b0 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ....return(CKR_F
1d9c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1d9d0 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b  ORTED);....break
1d9e0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1d9f0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1da00 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1da10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1da20 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1da30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1da40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1da50 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1da60 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1da70 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1da80 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1da90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1daa0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1dab0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1dac0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1dad0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1dae0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1daf0 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b   C_SignFinal)(CK
1db00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1db10 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1db20 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
1db30 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1db40 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
1db50 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54  {..static CK_BYT
1db60 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a  E sigbuf[1024];.
1db70 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c  .ssize_t sigbufl
1db80 65 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  en;..CK_RV retva
1db90 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
1dba0 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d  ERROR;..int term
1dbb0 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a  inate_sign = 1;.
1dbc0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1dbd0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1dbe0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1dbf0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1dc00 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1dc10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1dc20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dc30 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1dc40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1dc50 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1dc60 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1dc70 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74  ...if (pulSignat
1dc80 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20  ureLen == NULL) 
1dc90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1dca0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dcb0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
1dcc0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1dcd0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1dce0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1dcf0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
1dd00 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
1dd10 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1dd20 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1dd30 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1dd40 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1dd50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1dd60 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1dd70 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
1dd80 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1dd90 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1dda0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1ddb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1ddc0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1ddd0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1dde0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1ddf0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1de00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1de10 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1de20 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1de30 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1de40 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1de50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1de60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1de70 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1de80 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1de90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1dea0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1deb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dec0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1ded0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1dee0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1def0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1df00 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1df10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1df20 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
1df30 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1df40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1df50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1df60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1df70 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
1df80 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1df90 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1dfa0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
1dfb0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1dfc0 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
1dfd0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1dfe0 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
1dff0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
1e000 53 41 5f 50 4b 43 53 3a 0a 09 09 09 73 69 67 62  SA_PKCS:....sigb
1e010 75 66 6c 65 6e 20 3d 20 2d 31 3b 0a 0a 09 09 09  uflen = -1;.....
1e020 2f 2a 20 58 58 58 3a 20 41 73 6b 20 63 61 72 64  /* XXX: Ask card
1e030 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 0a 09 09 09   to sign */.....
1e040 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20  if (sigbuflen < 
1e050 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e  0) {...../* Sign
1e060 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09  ing failed. */..
1e070 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
1e080 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
1e090 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75  ..} else if (((u
1e0a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
1e0b0 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53  gbuflen) > *pulS
1e0c0 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 26 20 70  ignatureLen && p
1e0d0 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09  Signature) {....
1e0e0 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 74 61 20  ./* Signed data 
1e0f0 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09  too large */....
1e100 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  .retval = CKR_BU
1e110 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a  FFER_TOO_SMALL;.
1e120 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73  .....terminate_s
1e130 69 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c  ign = 0;....} el
1e140 73 65 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61  se {.....termina
1e150 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09  te_sign = 0;....
1e160 09 09 69 66 20 28 70 53 69 67 6e 61 74 75 72 65  ..if (pSignature
1e170 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  ) {......memcpy(
1e180 70 53 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62  pSignature, sigb
1e190 75 66 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a  uf, sigbuflen);.
1e1a0 0a 09 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f  ......terminate_
1e1b0 73 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a  sign = 1;.....}.
1e1c0 0a 09 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75  .....*pulSignatu
1e1d0 72 65 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65  reLen = sigbufle
1e1e0 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  n;......retval =
1e1f0 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09   CKR_OK;....}...
1e200 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
1e210 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43  CKM_SHA1_RSA_PKC
1e220 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c  S:..../* Accumul
1e230 61 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20  ate into a SHA1 
1e240 68 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65  hash */....cacke
1e250 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1e260 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1e270 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1e280 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e290 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1e2a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1e2b0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1e2c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1e2d0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
1e2e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e2f0 50 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65  PPORTED);....bre
1e300 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72  ak;..}...if (ter
1e310 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09  minate_sign) {..
1e320 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
1e330 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1e340 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72  ign_buf) {....fr
1e350 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
1e360 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1e370 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63  n_buf);...}....c
1e380 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1e390 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
1e3a0 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d  tive = 0;..}...m
1e3b0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1e3c0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1e3d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1e3e0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1e3f0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1e400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e410 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1e420 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1e430 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1e440 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1e450 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1e460 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e470 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
1e480 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
1e490 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
1e4a0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e4b0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f  K_RV, C_SignReco
1e4c0 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  verInit)(CK_SESS
1e4d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1e4e0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
1e4f0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
1e500 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1e510 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
1e520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e530 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1e540 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1e550 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1e560 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e570 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1e580 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1e590 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1e5a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1e5b0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1e5c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1e5d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1e5e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1e5f0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1e600 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e610 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1e620 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1e630 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1e640 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1e650 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
1e660 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53  nRecover)(CK_SES
1e670 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1e680 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1e690 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
1e6a0 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
1e6b0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
1e6c0 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ure, CK_ULONG_PT
1e6d0 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  R pulSignatureLe
1e6e0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
1e6f0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1e700 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1e710 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1e720 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e730 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e740 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1e750 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1e760 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1e770 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1e780 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1e790 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e7a0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1e7b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1e7c0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1e7d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1e7e0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1e7f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e800 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1e810 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e820 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69  _RV, C_VerifyIni
1e830 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1e840 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1e850 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
1e860 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
1e870 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
1e880 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
1e890 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1e8a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1e8b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1e8c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e8d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e8e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1e8f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1e900 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1e910 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1e920 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1e930 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e940 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1e950 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1e960 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1e970 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1e980 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1e990 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e9a0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1e9b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e9c0 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43  _RV, C_Verify)(C
1e9d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1e9e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1e9f0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
1ea00 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
1ea10 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
1ea20 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
1ea30 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
1ea40 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
1ea50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1ea60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1ea70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1ea80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ea90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1eaa0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1eab0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1eac0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1ead0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1eae0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1eaf0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1eb00 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1eb10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1eb20 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1eb30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1eb40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1eb50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1eb60 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1eb70 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1eb80 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64  _RV, C_VerifyUpd
1eb90 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
1eba0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1ebb0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
1ebc0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
1ebd0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
1ebe0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ebf0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1ec00 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1ec10 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1ec20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ec30 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1ec40 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1ec50 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1ec60 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1ec70 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1ec80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1ec90 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1eca0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1ecb0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1ecc0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ecd0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1ece0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ecf0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1ed00 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1ed10 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
1ed20 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  fyFinal)(CK_SESS
1ed30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1ed40 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1ed50 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
1ed60 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
1ed70 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
1ed80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1ed90 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1eda0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1edb0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1edc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1edd0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1ede0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1edf0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1ee00 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1ee10 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1ee20 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1ee30 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1ee40 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1ee50 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1ee60 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1ee70 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1ee80 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1ee90 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1eea0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1eeb0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
1eec0 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f  RecoverInit)(CK_
1eed0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1eee0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
1eef0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
1ef00 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
1ef10 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
1ef20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ef30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1ef40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1ef50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1ef60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ef70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1ef80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1ef90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1efa0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1efb0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1efc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1efd0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1efe0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1eff0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1f000 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f010 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1f020 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1f030 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f040 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1f050 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1f060 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28  _VerifyRecover)(
1f070 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1f080 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1f090 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
1f0a0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
1f0b0 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f  ignatureLen, CK_
1f0c0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
1f0d0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1f0e0 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  DataLen) {..CACK
1f0f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f100 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1f110 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1f120 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1f130 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f140 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1f150 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1f160 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1f170 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1f180 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1f190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1f1a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1f1b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1f1c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1f1d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1f1e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1f1f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1f200 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1f210 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1f220 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
1f230 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65  estEncryptUpdate
1f240 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1f250 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1f260 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
1f270 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
1f280 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
1f290 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
1f2a0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1f2b0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
1f2c0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
1f2d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f2e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1f2f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1f300 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f310 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f320 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1f330 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f340 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1f350 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1f360 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1f370 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1f380 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1f390 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1f3a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1f3b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f3c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1f3d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1f3e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1f3f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1f400 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69  _RV, C_DecryptDi
1f410 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53  gestUpdate)(CK_S
1f420 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1f430 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1f440 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
1f450 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
1f460 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
1f470 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
1f480 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
1f490 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
1f4a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f4b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f4c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f4d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f4e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f4f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f500 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f510 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f520 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f530 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1f540 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f550 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f560 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f570 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1f580 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f590 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1f5a0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1f5b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f5c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1f5d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1f5e0 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61  _SignEncryptUpda
1f5f0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
1f600 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1f610 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
1f620 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
1f630 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
1f640 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
1f650 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1f660 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
1f670 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1f680 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1f690 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1f6a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1f6b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1f6c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f6d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1f6e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1f6f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1f700 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1f710 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1f720 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1f730 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1f740 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1f750 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1f760 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f770 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1f780 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f790 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1f7a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1f7b0 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
1f7c0 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b  VerifyUpdate)(CK
1f7d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1f7e0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1f7f0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
1f800 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
1f810 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
1f820 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1f830 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
1f840 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
1f850 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f860 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1f870 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1f880 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1f890 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f8a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1f8b0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1f8c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f8d0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1f8e0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1f8f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f900 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1f910 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f920 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1f930 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1f940 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1f950 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1f960 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f970 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1f980 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1f990 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28   C_GenerateKey)(
1f9a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1f9b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
1f9c0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
1f9d0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52  chanism, CK_ATTR
1f9e0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
1f9f0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
1fa00 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
1fa10 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
1fa20 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
1fa30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1fa40 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1fa50 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1fa60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fa70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fa80 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1fa90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1faa0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1fab0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1fac0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1fad0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1fae0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1faf0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1fb00 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1fb10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1fb20 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1fb30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1fb40 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1fb50 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1fb60 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b  _RV, C_GenerateK
1fb70 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49  eyPair)(CK_SESSI
1fb80 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1fb90 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
1fba0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
1fbb0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
1fbc0 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70  R pPublicKeyTemp
1fbd0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
1fbe0 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62  lPublicKeyAttrib
1fbf0 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54  uteCount, CK_ATT
1fc00 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76  RIBUTE_PTR pPriv
1fc10 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20  ateKeyTemplate, 
1fc20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61  CK_ULONG ulPriva
1fc30 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f  teKeyAttributeCo
1fc40 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
1fc50 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c  ANDLE_PTR phPubl
1fc60 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  icKey, CK_OBJECT
1fc70 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72  _HANDLE_PTR phPr
1fc80 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43  ivateKey) {..CAC
1fc90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fca0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1fcb0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1fcc0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1fcd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fce0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1fcf0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1fd00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1fd10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1fd20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1fd30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fd40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1fd50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1fd60 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1fd70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1fd80 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1fd90 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1fda0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1fdb0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1fdc0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72  TION(CK_RV, C_Wr
1fdd0 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  apKey)(CK_SESSIO
1fde0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1fdf0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
1fe00 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
1fe10 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1fe20 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43   hWrappingKey, C
1fe30 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1fe40 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  hKey, CK_BYTE_PT
1fe50 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
1fe60 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57  K_ULONG_PTR pulW
1fe70 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a  rappedKeyLen) {.
1fe80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fe90 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1fea0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1feb0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1fec0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fed0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1fee0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1fef0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1ff00 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1ff10 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1ff20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ff30 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1ff40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1ff50 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1ff60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ff70 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1ff80 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1ff90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1ffa0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1ffb0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1ffc0 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f  C_UnwrapKey)(CK_
1ffd0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1ffe0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
1fff0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
20000 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
20010 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69  HANDLE hUnwrappi
20020 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50  ngKey, CK_BYTE_P
20030 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20  TR pWrappedKey, 
20040 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70  CK_ULONG ulWrapp
20050 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54  edKeyLen, CK_ATT
20060 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
20070 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
20080 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  lAttributeCount,
20090 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
200a0 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
200b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
200c0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
200d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
200e0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
200f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20100 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
20110 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
20120 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
20130 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
20140 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
20150 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20160 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
20170 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20180 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
20190 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
201a0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
201b0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
201c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
201d0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
201e0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
201f0 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53  _DeriveKey)(CK_S
20200 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
20210 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
20220 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
20230 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
20240 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20  ANDLE hBaseKey, 
20250 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
20260 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
20270 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65  LONG ulAttribute
20280 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
20290 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
202a0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
202b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
202c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
202d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
202e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
202f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20300 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
20310 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
20320 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
20330 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
20340 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
20350 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20360 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
20370 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
20380 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
20390 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
203a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
203b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
203c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
203d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
203e0 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f  _RV, C_SeedRando
203f0 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  m)(CK_SESSION_HA
20400 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
20410 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64  K_BYTE_PTR pSeed
20420 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65  , CK_ULONG ulSee
20430 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  dLen) {..CACKEY_
20440 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
20450 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
20460 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
20470 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
20480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20490 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
204a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
204b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
204c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
204d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
204e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
204f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
20500 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20510 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
20520 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20530 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
20540 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20550 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
20560 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
20570 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
20580 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53  teRandom)(CK_SES
20590 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
205a0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
205b0 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43  R pRandomData, C
205c0 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d  K_ULONG ulRandom
205d0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
205e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
205f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20600 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20610 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20620 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20630 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20640 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20650 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20660 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20670 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
20680 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20690 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
206a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
206b0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
206c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
206d0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
206e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
206f0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20  PPORTED);.}../* 
20700 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74  Deprecated Funct
20710 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  ion */.CK_DEFINE
20720 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20730 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74   C_GetFunctionSt
20740 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e  atus)(CK_SESSION
20750 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
20760 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
20770 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
20780 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
20790 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
207a0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
207b0 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20  ON_NOT_PARALLEL 
207c0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
207d0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
207e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
207f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
20800 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69  ALLEL);...hSessi
20810 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f  on = hSession; /
20820 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
20830 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
20840 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65  g */.}../* Depre
20850 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a  cated Function *
20860 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
20870 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61  TION(CK_RV, C_Ca
20880 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b  ncelFunction)(CK
20890 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
208a0 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43  hSession) {..CAC
208b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
208c0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
208d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
208e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
208f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
20900 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43  ARALLEL (%i)", C
20910 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20920 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74  PARALLEL);...ret
20930 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
20940 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
20950 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65  ..hSession = hSe
20960 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73  ssion; /* Supres
20970 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
20980 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
20990 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
209a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46  ON(CK_RV, C_GetF
209b0 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f  unctionList)(CK_
209c0 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54  FUNCTION_LIST_PT
209d0 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e  R_PTR ppFunction
209e0 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43  List) {..CK_FUNC
209f0 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46  TION_LIST_PTR pF
20a00 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43  unctionList;...C
20a10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20a20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
20a30 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c  .if (ppFunctionL
20a40 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
20a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20a60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46  INTF("Error. ppF
20a70 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e  unctionList is N
20a80 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
20a90 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
20aa0 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63  BAD);..}...pFunc
20ab0 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f  tionList = mallo
20ac0 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74  c(sizeof(*pFunct
20ad0 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75  ionList));...pFu
20ae0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
20af0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41  ion.major = ((CA
20b00 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
20b10 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31  RSION_CODE) >> 1
20b20 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e  6) & 0xff;..pFun
20b30 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
20b40 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43  on.minor = ((CAC
20b50 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
20b60 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29  SION_CODE) >> 8)
20b70 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63   & 0xff;...pFunc
20b80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
20b90 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69  ialize = C_Initi
20ba0 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  alize;..pFunctio
20bb0 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a  nList->C_Finaliz
20bc0 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a  e = C_Finalize;.
20bd0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
20be0 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65  C_GetInfo = C_Ge
20bf0 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  tInfo;..pFunctio
20c00 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
20c10 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74  List = C_GetSlot
20c20 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  List;..pFunction
20c30 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49  List->C_GetSlotI
20c40 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49  nfo = C_GetSlotI
20c50 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
20c60 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49  ist->C_GetTokenI
20c70 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e  nfo = C_GetToken
20c80 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
20c90 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53  List->C_WaitForS
20ca0 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69  lotEvent = C_Wai
20cb0 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09  tForSlotEvent;..
20cc0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
20cd0 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73  _GetMechanismLis
20ce0 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  t = C_GetMechani
20cf0 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69  smList;..pFuncti
20d00 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63  onList->C_GetMec
20d10 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47  hanismInfo = C_G
20d20 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b  etMechanismInfo;
20d30 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
20d40 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43  >C_InitToken = C
20d50 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75  _InitToken;..pFu
20d60 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e  nctionList->C_In
20d70 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49  itPIN = C_InitPI
20d80 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  N;..pFunctionLis
20d90 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f  t->C_SetPIN = C_
20da0 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69  SetPIN;..pFuncti
20db0 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65  onList->C_OpenSe
20dc0 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65  ssion = C_OpenSe
20dd0 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
20de0 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65  nList->C_CloseSe
20df0 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53  ssion = C_CloseS
20e00 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
20e10 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41  onList->C_CloseA
20e20 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43  llSessions = C_C
20e30 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b  loseAllSessions;
20e40 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
20e50 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66  >C_GetSessionInf
20e60 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e  o = C_GetSession
20e70 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
20e80 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61  List->C_GetOpera
20e90 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65  tionState = C_Ge
20ea0 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b  tOperationState;
20eb0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
20ec0 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53  >C_SetOperationS
20ed0 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72  tate = C_SetOper
20ee0 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75  ationState;..pFu
20ef0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f  nctionList->C_Lo
20f00 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09  gin = C_Login;..
20f10 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
20f20 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f  _Logout = C_Logo
20f30 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ut;..pFunctionLi
20f40 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65  st->C_CreateObje
20f50 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a  ct = C_CreateObj
20f60 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
20f70 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63  ist->C_CopyObjec
20f80 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74  t = C_CopyObject
20f90 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
20fa0 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  ->C_DestroyObjec
20fb0 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a  t = C_DestroyObj
20fc0 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
20fd0 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74  ist->C_GetObject
20fe0 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65  Size = C_GetObje
20ff0 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ctSize;..pFuncti
21000 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74  onList->C_GetAtt
21010 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f  ributeValue = C_
21020 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
21030 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
21040 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74  t->C_SetAttribut
21050 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74  eValue = C_SetAt
21060 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70  tributeValue;..p
21070 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
21080 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20  FindObjectsInit 
21090 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  = C_FindObjectsI
210a0 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
210b0 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
210c0 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  ts = C_FindObjec
210d0 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ts;..pFunctionLi
210e0 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
210f0 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f  sFinal = C_FindO
21100 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46  bjectsFinal;..pF
21110 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
21120 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45  ncryptInit = C_E
21130 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75  ncryptInit;..pFu
21140 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
21150 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70  crypt = C_Encryp
21160 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
21170 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61  t->C_EncryptUpda
21180 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70  te = C_EncryptUp
21190 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
211a0 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46  List->C_EncryptF
211b0 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74  inal = C_Encrypt
211c0 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
211d0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
211e0 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74  Init = C_Decrypt
211f0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
21200 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20  List->C_Decrypt 
21210 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46  = C_Decrypt;..pF
21220 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
21230 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ecryptUpdate = C
21240 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a  _DecryptUpdate;.
21250 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
21260 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d  C_DecryptFinal =
21270 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b   C_DecryptFinal;
21280 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
21290 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20  >C_DigestInit = 
212a0 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70  C_DigestInit;..p
212b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
212c0 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73  Digest = C_Diges
212d0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
212e0 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74  t->C_DigestUpdat
212f0 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61  e = C_DigestUpda
21300 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
21310 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20  st->C_DigestKey 
21320 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09  = C_DigestKey;..
21330 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
21340 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43  _DigestFinal = C
21350 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70  _DigestFinal;..p
21360 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
21370 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67  SignInit = C_Sig
21380 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  nInit;..pFunctio
21390 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20  nList->C_Sign = 
213a0 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69  C_Sign;..pFuncti
213b0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70  onList->C_SignUp
213c0 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64  date = C_SignUpd
213d0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
213e0 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c  ist->C_SignFinal
213f0 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a   = C_SignFinal;.
21400 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
21410 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
21420 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  t = C_SignRecove
21430 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  rInit;..pFunctio
21440 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63  nList->C_SignRec
21450 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63  over = C_SignRec
21460 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  over;..pFunction
21470 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e  List->C_VerifyIn
21480 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69  it = C_VerifyIni
21490 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
214a0 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f  t->C_Verify = C_
214b0 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69  Verify;..pFuncti
214c0 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
214d0 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66  Update = C_Verif
214e0 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  yUpdate;..pFunct
214f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
21500 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66  yFinal = C_Verif
21510 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  yFinal;..pFuncti
21520 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
21530 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f  RecoverInit = C_
21540 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
21550 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
21560 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76  t->C_VerifyRecov
21570 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63  er = C_VerifyRec
21580 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  over;..pFunction
21590 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e  List->C_DigestEn
215a0 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
215b0 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
215c0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
215d0 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69  ist->C_DecryptDi
215e0 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44  gestUpdate = C_D
215f0 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61  ecryptDigestUpda
21600 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
21610 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70  st->C_SignEncryp
21620 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e  tUpdate = C_Sign
21630 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
21640 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
21650 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70  _DecryptVerifyUp
21660 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74  date = C_Decrypt
21670 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70  VerifyUpdate;..p
21680 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
21690 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f  GenerateKey = C_
216a0 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46  GenerateKey;..pF
216b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
216c0 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d  enerateKeyPair =
216d0 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61   C_GenerateKeyPa
216e0 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ir;..pFunctionLi
216f0 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20  st->C_WrapKey = 
21700 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e  C_WrapKey;..pFun
21710 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77  ctionList->C_Unw
21720 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61  rapKey = C_Unwra
21730 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  pKey;..pFunction
21740 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65  List->C_DeriveKe
21750 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b  y = C_DeriveKey;
21760 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
21770 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20  >C_SeedRandom = 
21780 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70  C_SeedRandom;..p
21790 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
217a0 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d  GenerateRandom =
217b0 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f   C_GenerateRando
217c0 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  m;..pFunctionLis
217d0 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  t->C_GetFunction
217e0 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75  Status = C_GetFu
217f0 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70  nctionStatus;..p
21800 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
21810 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d  CancelFunction =
21820 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f   C_CancelFunctio
21830 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
21840 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  t->C_GetFunction
21850 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63  List = C_GetFunc
21860 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46  tionList;...*ppF
21870 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46  unctionList = pF
21880 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43  unctionList;...C
21890 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
218a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
218b0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
218c0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
218d0 52 5f 4f 4b 29 3b 0a 7d 0a 0a                    R_OK);.}..