Hex Artifact Content

Artifact 4487b6bfe2776b934d77fae59723d396d583322d:


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 0a 09 69  ction_depth;...i
3830: 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 7d  nt slot_reset;.}
3840: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
3850: 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  {..CACKEY_TLV_AP
3860: 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31  P_GENERIC = 0x01
3870: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  ,..CACKEY_TLV_AP
3880: 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32  P_SKI     = 0x02
3890: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  ,..CACKEY_TLV_AP
38a0: 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34  P_PKI     = 0x04
38b0: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70  .} cackey_tlv_ap
38c0: 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20  ptype;..typedef 
38d0: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54  enum {..CACKEY_T
38e0: 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c  LV_OBJID_GENERAL
38f0: 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32  INFO       = 0x2
3900: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
3910: 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e  _OBJID_PROPERSON
3920: 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30  ALINFO   = 0x210
3930: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
3940: 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52  BJID_ACCESSCONTR
3950: 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c  OL     = 0x3000,
3960: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3970: 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20  ID_LOGIN        
3980: 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09       = 0x4000,..
3990: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
39a0: 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20  _CARDINFO       
39b0: 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41     = 0x5000,..CA
39c0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42  CKEY_TLV_OBJID_B
39d0: 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20 20 20  IOMETRICS       
39e0: 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b   = 0x6000,..CACK
39f0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47  EY_TLV_OBJID_DIG
3a00: 49 54 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d  ITALSIGCERT    =
3a10: 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x7000,..CACKEY
3a20: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
3a30: 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30  ERSON        = 0
3a40: 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x0200,..CACKEY_T
3a50: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e  LV_OBJID_CAC_BEN
3a60: 45 46 49 54 53 20 20 20 20 20 20 3d 20 30 78 30  EFITS      = 0x0
3a70: 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  202,..CACKEY_TLV
3a80: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52  _OBJID_CAC_OTHER
3a90: 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30  BENEFITS = 0x020
3aa0: 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  3,..CACKEY_TLV_O
3ab0: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e  BJID_CAC_PERSONN
3ac0: 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c  EL     = 0x0201,
3ad0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3ae0: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20  ID_CAC_PKICERT  
3af0: 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20       = 0x02FE.} 
3b00: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
3b10: 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  tid;..typedef en
3b20: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53  um {..CACKEY_PCS
3b30: 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
3b40: 20 20 20 20 3d 20 32 2c 0a 09 43 41 43 4b 45 59      = 2,..CACKEY
3b50: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53  _PCSC_S_TOKENABS
3b60: 45 4e 54 20 20 20 20 20 3d 20 31 2c 0a 09 43 41  ENT     = 1,..CA
3b70: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c              = 0,
3b90: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
3ba0: 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20  GENERIC         
3bb0: 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -1,..CACKEY_PC
3bc0: 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20  SC_E_BADPIN     
3bd0: 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b       = -2,..CACK
3be0: 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
3bf0: 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a            = -3,.
3c00: 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73  } cackey_ret;..s
3c10: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
3c20: 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69  _cardurl {..unsi
3c30: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20  gned char       
3c40: 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79   rid[5];..cackey
3c50: 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61  _tlv_apptype   a
3c60: 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  pptype;..cackey_
3c70: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62  tlv_objectid  ob
3c80: 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f  jectid;..cackey_
3c90: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70  tlv_objectid  ap
3ca0: 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  pid;..unsigned c
3cb0: 68 61 72 20 20 20 20 20 20 20 20 70 69 6e 69 64  har        pinid
3cc0: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
3cd0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a  key_tlv_entity;.
3ce0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
3cf0: 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74  v_entity {..uint
3d00: 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74  8_t tag;..size_t
3d10: 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e   length;...union
3d20: 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65   {...void *value
3d30: 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b 65  ;...struct cacke
3d40: 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76  y_tlv_cardurl *v
3d50: 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09  alue_cardurl;...
3d60: 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79  uint8_t value_by
3d70: 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74  te;..};...struct
3d80: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
3d90: 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f  ty *_next;.};../
3da0: 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20  * CACKEY Global 
3db0: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69  Handles */.stati
3dc0: 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62  c void *cackey_b
3dd0: 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73  iglock = NULL;.s
3de0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
3df0: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b  key_session cack
3e00: 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d  ey_sessions[128]
3e10: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
3e20: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b  cackey_slot cack
3e30: 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73  ey_slots[128];.s
3e40: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
3e50: 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30  _initialized = 0
3e60: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ;.static int cac
3e70: 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
3e80: 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49   = 0;.CK_C_INITI
3e90: 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65  ALIZE_ARGS cacke
3ea0: 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50 43 53 43  y_args;../* PCSC
3eb0: 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20   Global Handles 
3ec0: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52  */.static LPSCAR
3ed0: 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f  DCONTEXT cackey_
3ee0: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
3ef0: 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  LL;..static unsi
3f00: 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79  gned long cackey
3f10: 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64  _getversion(void
3f20: 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69  ) {..static unsi
3f30: 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c  gned long retval
3f40: 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65   = 255;..unsigne
3f50: 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30  d long major = 0
3f60: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
3f70: 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61   minor = 0;..cha
3f80: 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e  r *major_str = N
3f90: 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f  ULL;..char *mino
3fa0: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  r_str = NULL;...
3fb0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
3fc0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
3fd0: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20  ..if (retval != 
3fe0: 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  255) {...CACKEY_
3ff0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
4000: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63  turning 0x%lx (c
4010: 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c  ached).", retval
4020: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74  );....return(ret
4030: 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  val);..}...retva
4040: 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50  l = 0;..#ifdef P
4050: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20  ACKAGE_VERSION. 
4060: 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72         major_str
4070: 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49   = PACKAGE_VERSI
4080: 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73  ON;..if (major_s
4090: 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d  tr) {..        m
40a0: 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d  ajor = strtoul(m
40b0: 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72  ajor_str, &minor
40c0: 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66  _str, 10);....if
40d0: 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09   (minor_str) {..
40e0: 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75  ..minor = strtou
40f0: 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c  l(minor_str + 1,
4100: 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a   NULL, 10);...}.
4110: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d  .}...retval = (m
4120: 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d  ajor << 16) | (m
4130: 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64  inor << 8);.#end
4140: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
4150: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
4160: 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76  ing 0x%lx", retv
4170: 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
4180: 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f  tval);.}../* PC/
4190: 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74  SC Related Funct
41a0: 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59  ions */./*. * SY
41b0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f  NPOSIS. *     vo
41c0: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  id cackey_slots_
41d0: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76  disconnect_all(v
41e0: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
41f0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
4200: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
4210: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
4220: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
4230: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
4240: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72  n disconnects fr
4250: 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a  om all cards.. *
4260: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
4270: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69   cackey_slots_di
4280: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69  sconnect_all(voi
4290: 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  d) {..uint32_t i
42a0: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
42b0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
42c0: 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78  d.");...for (idx
42d0: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
42e0: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
42f0: 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
4300: 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
4310: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
4320: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
4330: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
4340: 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ed) {....CACKEY_
4350: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
4360: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c  ardDisconnect(%l
4370: 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73  u) called", (uns
4380: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29  igned long) idx)
4390: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
43a0: 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f  nnect(cackey_slo
43b0: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72  ts[idx].pcsc_car
43c0: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
43d0: 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  ARD);...}....cac
43e0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
43f0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
4400: 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ed = 0;...cackey
4410: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
4420: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
4430: 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  0;....if (cackey
4440: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
4450: 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ve) {....CACKEY_
4460: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
4470: 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f  rking active slo
4480: 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72  t %lu as being r
4490: 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64  eset", (unsigned
44a0: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d   long) idx);...}
44b0: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
44c0: 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  [idx].slot_reset
44d0: 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45   = 1;..}...CACKE
44e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
44f0: 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72  Returning");...r
4500: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
4510: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
4520: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
4530: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76  y_pcsc_connect(v
4540: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
4550: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
4560: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
4570: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
4580: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
4590: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
45a0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
45b0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
45c0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
45d0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
45e0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63   function connec
45f0: 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20  ts to the PC/SC 
4600: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67  Connection Manag
4610: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 74  er and updates t
4620: 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c  he. *     global
4630: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
4640: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
4650: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  t cackey_pcsc_co
4660: 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c  nnect(void) {..L
4670: 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f  ONG scard_est_co
4680: 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65  ntext_ret;.#ifde
4690: 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41  f HAVE_SCARDISVA
46a0: 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47  LIDCONTEXT..LONG
46b0: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72   scard_isvalid_r
46c0: 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  et;.#endif...CAC
46d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
46e0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
46f0: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
4700: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
4710: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
4720: 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73  andle = malloc(s
4730: 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63  izeof(*cackey_pc
4740: 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69  sc_handle));...i
4750: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
4760: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
4770: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
4780: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
4790: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
47a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
47b0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61  ailure");.....ca
47c0: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
47d0: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09  nnect_all();....
47e0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
47f0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
4800: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
4810: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
4820: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
4830: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09  t() called");...
4840: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
4850: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74  t_ret = SCardEst
4860: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43  ablishContext(SC
4870: 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d  ARD_SCOPE_SYSTEM
4880: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61  , NULL, NULL, ca
4890: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
48a0: 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65  );...if (scard_e
48b0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21  st_context_ret !
48c0: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
48d0: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
48e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
48f0: 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c  l to SCardEstabl
4900: 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65  ishContext faile
4910: 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25  d (returned %s/%
4920: 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  li), returning i
4930: 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b  n failure", CACK
4940: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
4950: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
4960: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
4970: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
4980: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
4990: 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61  et);.....free(ca
49a0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
49b0: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
49c0: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
49d0: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
49e0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
49f0: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a  ENERIC);...}..}.
4a00: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41  .#ifdef HAVE_SCA
4a10: 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54  RDISVALIDCONTEXT
4a20: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4a30: 52 49 4e 54 46 28 22 53 43 61 72 64 49 73 56 61  RINTF("SCardIsVa
4a40: 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  lidContext() cal
4a50: 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73  led");..scard_is
4a60: 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72  valid_ret = SCar
4a70: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28  dIsValidContext(
4a80: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
4a90: 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64  dle);..if (scard
4aa0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20  _isvalid_ret != 
4ab0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
4ac0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
4ad0: 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65  G_PRINTF("Handle
4ae0: 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61   has become inva
4af0: 6c 69 64 20 28 53 43 61 72 64 49 73 56 61 6c 69  lid (SCardIsVali
4b00: 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c  dContext = %s/%l
4b10: 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65  i), trying to re
4b20: 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20  -establish...", 
4b30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4b40: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
4b50: 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  R(scard_isvalid_
4b60: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
4b70: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b  rd_isvalid_ret);
4b80: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
4b90: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73  _PRINTF("SCardEs
4ba0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29  tablishContext()
4bb0: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61   called");...sca
4bc0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
4bd0: 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c  et = SCardEstabl
4be0: 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44  ishContext(SCARD
4bf0: 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e  _SCOPE_SYSTEM, N
4c00: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65  ULL, NULL, cacke
4c10: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
4c20: 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f  ..if (scard_est_
4c30: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
4c40: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
4c50: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
4c60: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
4c70: 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  o SCardEstablish
4c80: 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28  Context failed (
4c90: 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29  returned %s/%li)
4ca0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
4cb0: 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f  ailure", CACKEY_
4cc0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
4cd0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
4ce0: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4cf0: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
4d00: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
4d10: 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65  ;.....free(cacke
4d20: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
4d30: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
4d40: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
4d50: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
4d60: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
4d70: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  RIC);...}....CAC
4d80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
4d90: 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65  ("Handle has bee
4da0: 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64  n re-established
4db0: 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  ");..}.#endif...
4dc0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4dd0: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
4de0: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43   connected to PC
4df0: 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  /SC, returning i
4e00: 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72  n success");...r
4e10: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
4e20: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
4e30: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
4e40: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
4e50: 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
4e60: 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a  ect(void);. *. *
4e70: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
4e80: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
4e90: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
4ea0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
4eb0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
4ec0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
4ed0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
4ee0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
4ef0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
4f00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
4f10: 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20  isconnects from 
4f20: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
4f30: 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64  tion manager and
4f40: 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20   updates. *     
4f50: 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c  the global handl
4f60: 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  e.. *. */.static
4f70: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
4f80: 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
4f90: 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47  ct(void) {..LONG
4fa0: 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65   scard_rel_conte
4fb0: 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  xt_ret;...CACKEY
4fc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
4fd0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
4fe0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
4ff0: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le == NULL) {...
5000: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5010: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73  SC_S_OK);..}...s
5020: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
5030: 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65  _ret = SCardRele
5040: 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b  aseContext(*cack
5050: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
5060: 0a 0a 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
5070: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 63 61  csc_handle);..ca
5080: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
5090: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 69 66 20 28 73   = NULL;...if (s
50a0: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
50b0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
50c0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74  SUCCESS) {...ret
50d0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
50e0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
50f0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5100: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
5110: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
5120: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
5130: 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
5140: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
5150: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a  _slot *slot);. *
5160: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
5170: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
5180: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
5190: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
51a0: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
51b0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
51c0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
51d0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
51e0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
51f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5200: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
5210: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
5220: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
5230: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
5240: 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63  et cackey_connec
5250: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61  t_card(struct ca
5260: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
5270: 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70   {..cackey_ret p
5280: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b  csc_connect_ret;
5290: 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c  ..DWORD protocol
52a0: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f  ;..LONG scard_co
52b0: 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nn_ret;...CACKEY
52c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
52d0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
52e0: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45  !slot) {...CACKE
52f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5300: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65  Invalid slot spe
5310: 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e  cified, returnin
5320: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
5330: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5340: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
5350: 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e  ;..}...pcsc_conn
5360: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
5370: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b  _pcsc_connect();
5380: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
5390: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
53a0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
53b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
53c0: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
53d0: 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c  to PC/SC failed,
53e0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
53f0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
5400: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
5410: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
5420: 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65  /* Connect to re
5430: 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 64 20  ader, if needed 
5440: 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70  */..if (!slot->p
5450: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
5460: 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
5470: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
5480: 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 63 61  rdConnect(%s) ca
5490: 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73  lled", slot->pcs
54a0: 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73 63 61  c_reader);...sca
54b0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
54c0: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
54d0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
54e0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
54f0: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
5500: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
5510: 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d  TOCOL_T0, &slot-
5520: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
5530: 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73  tocol);....if (s
5540: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d  card_conn_ret !=
5550: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
5560: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
5570: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e  BUG_PRINTF("Conn
5580: 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66  ection to card f
5590: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
55a0: 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61   in failure (SCa
55b0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73  rdConnect() = %s
55c0: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44  /%li)", CACKEY_D
55d0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
55e0: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
55f0: 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  conn_ret), (long
5600: 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ) scard_conn_ret
5610: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
5620: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
5630: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f  RIC);...}....slo
5640: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
5650: 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c  nected = 1;...sl
5660: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
5670: 64 65 70 74 68 20 3d 20 30 3b 0a 09 7d 0a 0a 09  depth = 0;..}...
5680: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5690: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
56a0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
56b0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
56c0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
56d0: 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61  action(struct ca
56e0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
56f0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
5700: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
5710: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
5720: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
5730: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
5740: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
5750: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
5760: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
5770: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
5780: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
5790: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
57a0: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
57b0: 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72 61  S. *     The tra
57c0: 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  nsaction should 
57d0: 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73  be terminated us
57e0: 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f  ing "cackey_end_
57f0: 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a  transaction". *.
5800: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
5810: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67  y_ret cackey_beg
5820: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
5830: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5840: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b  t *slot) {..cack
5850: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f  ey_ret cackey_co
5860: 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63  nn_ret;..LONG sc
5870: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a  ard_trans_ret;..
5880: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5890: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
58a0: 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  ...cackey_conn_r
58b0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
58c0: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
58d0: 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e  .if (cackey_conn
58e0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
58f0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
5900: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5910: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
5920: 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
5930: 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
5940: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
5950: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
5960: 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d  RIC);..}...slot-
5970: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
5980: 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  th++;...if (slot
5990: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
59a0: 70 74 68 20 3e 20 31 29 20 7b 0a 09 09 43 41 43  pth > 1) {...CAC
59b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
59c0: 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74  ("Already in a t
59d0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66  ransaction, perf
59e0: 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e  orming no action
59f0: 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69   (new depth = %i
5a00: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
5a10: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
5a20: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5a30: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
5a40: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
5a50: 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e  = SCardBeginTran
5a60: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63  saction(slot->pc
5a70: 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73  sc_card);..if (s
5a80: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21  card_trans_ret !
5a90: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
5aa0: 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
5ab0: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
5ac0: 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e  le to begin tran
5ad0: 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69  saction, returni
5ae0: 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a  ng in error");..
5af0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5b00: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
5b10: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
5b20: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73  UG_PRINTF("Suces
5b30: 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 61  sfully began tra
5b40: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74  nsaction on slot
5b50: 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63   (%s)", slot->pc
5b60: 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65  sc_reader);...re
5b70: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
5b80: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
5b90: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
5ba0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
5bb0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
5bc0: 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  on(struct cackey
5bd0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a  _slot *slot);. *
5be0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
5bf0: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
5c00: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
5c10: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
5c20: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
5c30: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
5c40: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
5c50: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
5c60: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
5c70: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5c80: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
5c90: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
5ca0: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
5cb0: 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63 61 63  on requires "cac
5cc0: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
5cd0: 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c  ction" to be cal
5ce0: 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f  led first. *. */
5cf0: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
5d00: 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  et cackey_end_tr
5d10: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
5d20: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
5d30: 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72  ot) {..LONG scar
5d40: 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43  d_trans_ret;...C
5d50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5d60: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
5d70: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63  .if (!slot->pcsc
5d80: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
5d90: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
5da0: 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69  G_PRINTF("Card i
5db0: 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c  s not connected,
5dc0: 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74   unable to end t
5dd0: 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 0a 09  ransaction");...
5de0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
5df0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
5e00: 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .}...if (slot->t
5e10: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
5e20: 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
5e30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5e40: 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72  Terminating a tr
5e50: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68  ansaction that h
5e60: 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b  as not begun!");
5e70: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
5e80: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5e90: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
5ea0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
5eb0: 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  -;...if (slot->t
5ec0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
5ed0: 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59   > 0) {...CACKEY
5ee0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
5ef0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
5f00: 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e  l in progress, n
5f10: 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f  ot terminating o
5f20: 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  n-card Transacti
5f30: 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74  on (current dept
5f40: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
5f50: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
5f60: 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  h);....return(CA
5f70: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
5f80: 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64  RIC);..}...scard
5f90: 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61  _trans_ret = SCa
5fa0: 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  rdEndTransaction
5fb0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
5fc0: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
5fd0: 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  RD);..if (scard_
5fe0: 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41  trans_ret != SCA
5ff0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
6000: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6010: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
6020: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
6030: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
6040: 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  rror");....retur
6050: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
6060: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
6070: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6080: 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20  TF("Sucessfully 
6090: 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73  terminated trans
60a0: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28  action on slot (
60b0: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  %s)", slot->pcsc
60c0: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75  _reader);...retu
60d0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
60e0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55  _OK);.}../* APDU
60f0: 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f   Related Functio
6100: 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50  ns */./*. * SYNP
6110: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
6120: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
6130: 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63  nd_apdu(struct c
6140: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
6150: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6160: 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20  class, unsigned 
6170: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
6180: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6190: 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p1, unsigned cha
61a0: 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63  r p2, unsigned c
61b0: 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64  har lc, unsigned
61c0: 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73   char *data, uns
61d0: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75  igned char le, u
61e0: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
61f0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
6200: 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65   *respdata, size
6210: 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  _t *respdata_len
6220: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
6230: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
6240: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
6250: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
6260: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
6270: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
6280: 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a  ed char class. *
6290: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43 6c           APDU Cl
62a0: 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53  ass (GSCIS_CLASS
62b0: 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49  _ISO7816 or GSCI
62c0: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
62d0: 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20  LATFORM. *      
62e0: 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c     usually), (CL
62f0: 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  A). *. *     uns
6300: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72  igned char instr
6310: 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20  uction. *       
6320: 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74 69    APDU Instructi
6330: 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20  on (INS). *. *  
6340: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
6350: 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41   p1. *         A
6360: 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31 20  PDU Parameter 1 
6370: 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75  (P1). *. *     u
6380: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a  nsigned char p2.
6390: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
63a0: 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32 29  Parameter 2 (P2)
63b0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
63c0: 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20  ned char lc. *  
63d0: 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67         APDU Leng
63e0: 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c  th of Content (L
63f0: 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68  c) -- this is th
6400: 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74  e length of "dat
6410: 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61  a". *         pa
6420: 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61  rameter.  If "da
6430: 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65 64  ta" is specified
6440: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70   as NULL, this p
6450: 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a  arameter will. *
6460: 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f           be igno
6470: 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  red.. *. *     u
6480: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
6490: 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f  ta. *         Po
64a0: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
64b0: 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f  to send.  It sho
64c0: 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74 65  uld be "Lc" byte
64d0: 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20  s long.  If. *  
64e0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
64f0: 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77   as NULL, "Lc" w
6500: 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c  ill not be sent,
6510: 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65 72   and this buffer
6520: 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20   will be. *     
6530: 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a      ignored.. *.
6540: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
6550: 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20  char le. *      
6560: 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f     APDU Length o
6570: 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c  f Expectation (L
6580: 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68  e) -- this is th
6590: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a  e length of the.
65a0: 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65 63   *         expec
65b0: 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74  ted reply.  If t
65c0: 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65 64  his is specified
65d0: 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77 69   as 0 then it wi
65e0: 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20  ll not. *       
65f0: 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a    be sent.. *. *
6600: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72       uint16_t *r
6610: 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20  espcode. *      
6620: 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72     [OUT] Pointer
6630: 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41   to storage of A
6640: 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64  PDU response cod
6650: 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a 20  e.  If this is. 
6660: 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66  *         specif
6670: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65  ied as NULL, the
6680: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77   response code w
6690: 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 64  ill be discarded
66a0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  .. *. *     unsi
66b0: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
66c0: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  ata. *         [
66d0: 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT] Pointer to 
66e0: 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20  storage of APDU 
66f0: 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20  response data.  
6700: 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20  If this is. *   
6710: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
6720: 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  as NULL, the res
6730: 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20  ponse data will 
6740: 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  be discarded.  I
6750: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  f. *         the
6760: 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20   "respdata_len" 
6770: 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70 65  parameter is spe
6780: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
6790: 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20  this buffer. *  
67a0: 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20         will not 
67b0: 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20  be updated.. *. 
67c0: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65  *     size_t *re
67d0: 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20  spdata_len. *   
67e0: 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20        [IN, OUT] 
67f0: 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69  Pointer initiali
6800: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
6810: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72  e size of the "r
6820: 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20  espdata". *     
6830: 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65 66      buffer.  Bef
6840: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74  ore returning, t
6850: 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61  he pointed to va
6860: 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20 74  lue is updated t
6870: 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  o the. *        
6880: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6890: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
68a0: 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69 73  buffer.  If this
68b0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
68c0: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  . *         NULL
68d0: 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  , it will not be
68e0: 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72   updated, and "r
68f0: 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65  espdata" will be
6900: 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67   ignored causing
6910: 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  . *         the 
6920: 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f  response data to
6930: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
6940: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
6950: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
6960: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
6970: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
6980: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
6990: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
69a0: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
69b0: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
69c0: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e  nction will conn
69d0: 65 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43  ect to the PC/SC
69e0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61   Connection Mana
69f0: 67 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63  ger via. *     c
6a00: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
6a10: 63 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a  ct() if needed..
6a20: 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c   *. *     It wil
6a30: 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65  l connect to the
6a40: 20 63 61 72 64 20 69 6e 20 74 68 65 20 72 65 61   card in the rea
6a50: 64 65 72 20 61 74 74 61 63 68 65 64 20 74 6f 20  der attached to 
6a60: 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20  the slot. *     
6a70: 73 70 65 63 69 66 69 65 64 2e 20 20 49 74 20 77  specified.  It w
6a80: 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f  ill reconnect to
6a90: 20 74 68 65 20 63 61 72 64 20 69 66 20 74 68 65   the card if the
6aa0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20   connection. *  
6ab0: 20 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a     goes away.. *
6ac0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
6ad0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
6ae0: 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63  nd_apdu(struct c
6af0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
6b00: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6b10: 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20  class, unsigned 
6b20: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
6b30: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6b40: 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p1, unsigned cha
6b50: 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63  r p2, unsigned c
6b60: 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64  har lc, unsigned
6b70: 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73   char *data, uns
6b80: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75  igned char le, u
6b90: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
6ba0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
6bb0: 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65   *respdata, size
6bc0: 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  _t *respdata_len
6bd0: 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a  ) {..uint8_t maj
6be0: 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b  or_rc, minor_rc;
6bf0: 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74  ..size_t bytes_t
6c00: 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70  o_copy, tmp_resp
6c10: 64 61 74 61 5f 6c 65 6e 3b 0a 09 44 57 4f 52 44  data_len;..DWORD
6c20: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52   protocol;..DWOR
6c30: 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76  D xmit_len, recv
6c40: 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _len;..LONG scar
6c50: 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72  d_xmit_ret, scar
6c60: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42  d_reconn_ret;..B
6c70: 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32  YTE xmit_buf[102
6c80: 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32  4], recv_buf[102
6c90: 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f  4];..int pcsc_co
6ca0: 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f  nnect_ret, pcsc_
6cb0: 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e  getresp_ret;..in
6cc0: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
6cd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6ce0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
6cf0: 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  slot) {...CACKEY
6d00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
6d10: 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63  nvalid slot spec
6d20: 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ified.");....ret
6d30: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6d40: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
6d50: 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
6d60: 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
6d70: 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
6d80: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
6d90: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
6da0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
6db0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6dc0: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
6dd0: 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
6de0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
6df0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
6e00: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6e10: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
6e20: 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69  Transmit */..xmi
6e30: 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74  t_len = 0;..xmit
6e40: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
6e50: 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f   = class;..xmit_
6e60: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
6e70: 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09  = instruction;..
6e80: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
6e90: 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74  n++] = p1;..xmit
6ea0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
6eb0: 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61   = p2;..if (data
6ec0: 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78  ) {...xmit_buf[x
6ed0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b  mit_len++] = lc;
6ee0: 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
6ef0: 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b   idx < lc; idx++
6f00: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  ) {....xmit_buf[
6f10: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61  xmit_len++] = da
6f20: 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a  ta[idx];...}..}.
6f30: 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30  ..if (le != 0x00
6f40: 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78  ) {...xmit_buf[x
6f50: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b  mit_len++] = le;
6f60: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53  ..}.../* Begin S
6f70: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
6f80: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
6f90: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
6fa0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 43 41 43 4b 45  n(slot);...CACKE
6fb0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
6fc0: 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 22  ("Sending APDU:"
6fd0: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
6fe0: 5f 6c 65 6e 29 3b 0a 0a 09 72 65 63 76 5f 6c 65  _len);...recv_le
6ff0: 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f  n = sizeof(recv_
7000: 62 75 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69  buf);..scard_xmi
7010: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61  t_ret = SCardTra
7020: 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nsmit(slot->pcsc
7030: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 50 43 49  _card, SCARD_PCI
7040: 5f 54 30 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  _T0, xmit_buf, x
7050: 6d 69 74 5f 6c 65 6e 2c 20 53 43 41 52 44 5f 50  mit_len, SCARD_P
7060: 43 49 5f 54 31 2c 20 72 65 63 76 5f 62 75 66 2c  CI_T1, recv_buf,
7070: 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 69 66   &recv_len);..if
7080: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
7090: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
70a0: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
70b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
70c0: 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44  iled to send APD
70d0: 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72 64  U to card (SCard
70e0: 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f  Transmit() = %s/
70f0: 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  %lx)", CACKEY_DE
7100: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
7110: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
7120: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
7130: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
7140: 78 6d 69 74 5f 72 65 74 29 3b 0a 09 09 43 41 43  xmit_ret);...CAC
7150: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7160: 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74 20 61  ("Marking slot a
7170: 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65  s having been re
7180: 73 65 74 22 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e  set");....slot->
7190: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
71a0: 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 73  h = 0;...slot->s
71b0: 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a  lot_reset = 1;..
71c0: 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
71d0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f  _ret == SCARD_W_
71e0: 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09  RESET_CARD) {...
71f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7200: 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75  INTF("Reset requ
7210: 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c  ired, please hol
7220: 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  d...");.....scar
7230: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  d_reconn_ret = S
7240: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
7250: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7260: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7270: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7280: 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T0, SCARD_RESE
7290: 54 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f 63 6f  T_CARD, &protoco
72a0: 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64  l);....if (scard
72b0: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
72c0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
72d0: 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61  {...../* Re-esta
72e0: 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f  blish transactio
72f0: 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65  n, if it was pre
7300: 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28  sent */.....if (
7310: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7320: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
7330: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
7340: 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09  ction_depth--;..
7350: 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
7360: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
7370: 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
7380: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7390: 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
73a0: 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74  sful, retransmit
73b0: 74 69 6e 67 22 29 3b 0a 09 09 09 09 73 63 61 72  ting");.....scar
73c0: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61  d_xmit_ret = SCa
73d0: 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d  rdTransmit(slot-
73e0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
73f0: 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74 5f 62  D_PCI_T0, xmit_b
7400: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 53 43  uf, xmit_len, SC
7410: 41 52 44 5f 50 43 49 5f 54 30 2c 20 72 65 63 76  ARD_PCI_T0, recv
7420: 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29  _buf, &recv_len)
7430: 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64  ;......if (scard
7440: 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41  _xmit_ret != SCA
7450: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
7460: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
7470: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e  G_PRINTF("Retran
7480: 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74  smit failed, ret
7490: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
74a0: 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65  e after disconne
74b0: 63 74 69 6e 67 20 74 68 65 20 63 61 72 64 20 28  cting the card (
74c0: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20  SCardTransmit = 
74d0: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
74e0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
74f0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
7500: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f  d_xmit_ret), (lo
7510: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
7520: 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64  et);.......SCard
7530: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
7540: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
7550: 44 5f 52 45 53 45 54 5f 43 41 52 44 29 3b 0a 09  D_RESET_CARD);..
7560: 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
7570: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
7580: 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20  0;......./* End 
7590: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
75a0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c  ction */......sl
75b0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
75c0: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09  depth = 1;......
75d0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
75e0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
75f0: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
7600: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
7610: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  );.....}....} el
7620: 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  se {.....CACKEY_
7630: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69  DEBUG_PRINTF("Di
7640: 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64  sconnecting card
7650: 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69  ");......SCardDi
7660: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
7670: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
7680: 52 45 53 45 54 5f 43 41 52 44 29 3b 0a 09 09 09  RESET_CARD);....
7690: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
76a0: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
76b0: 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
76c0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
76d0: 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74  n */.....slot->t
76e0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
76f0: 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79   = 1;.....cackey
7700: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
7710: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43  (slot);......CAC
7720: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7730: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  ("Returning in f
7740: 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65  ailure");.....re
7750: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7760: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 09  _E_GENERIC);....
7770: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
7780: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7790: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
77a0: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 53  ng card");.....S
77b0: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
77c0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
77d0: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
77e0: 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  );....slot->pcsc
77f0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
7800: 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  = 0;...../* End 
7810: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
7820: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74  ction */....slot
7830: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
7840: 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b  pth = 1;....cack
7850: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
7860: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 43 41  on(slot);.....CA
7870: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7880: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
7890: 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 72 65  failure");....re
78a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
78b0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
78c0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
78d0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 65 74  UG_PRINTBUF("Ret
78e0: 75 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20 72  urned Value:", r
78f0: 65 63 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65  ecv_buf, recv_le
7900: 6e 29 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c  n);...if (recv_l
7910: 65 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d  en < 2) {.../* M
7920: 69 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20  inimal response 
7930: 6c 65 6e 67 74 68 20 69 73 20 32 20 62 79 74 65  length is 2 byte
7940: 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  s, returning in 
7950: 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43  failure */...CAC
7960: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7970: 28 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73  ("Response too s
7980: 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20  mall, returning 
7990: 69 6e 20 66 61 69 6c 75 72 65 20 28 72 65 63 76  in failure (recv
79a0: 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75  _len = %lu)", (u
79b0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
79c0: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45  cv_len);..../* E
79d0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
79e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61  nsaction */...ca
79f0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
7a00: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72  tion(slot);....r
7a10: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
7a20: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
7a30: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
7a40: 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09  result code */..
7a50: 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f  major_rc = recv_
7a60: 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32  buf[recv_len - 2
7a70: 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72  ];..minor_rc = r
7a80: 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e  ecv_buf[recv_len
7a90: 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65 73 70   - 1];..if (resp
7aa0: 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70 63  code) {...*respc
7ab0: 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20  ode = (major_rc 
7ac0: 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63  << 8) | minor_rc
7ad0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74  ;..}.../* Adjust
7ae0: 20 6d 65 73 73 61 67 65 20 62 75 66 66 65 72 20   message buffer 
7af0: 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20  */..recv_len -= 
7b00: 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74 65  2;.../* Add byte
7b10: 73 20 74 6f 20 72 65 74 75 72 6e 20 76 61 6c 75  s to return valu
7b20: 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61  e */..tmp_respda
7b30: 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20  ta_len = 0;..if 
7b40: 28 72 65 73 70 64 61 74 61 20 26 26 20 72 65 73  (respdata && res
7b50: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74  pdata_len) {...t
7b60: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  mp_respdata_len 
7b70: 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  = *respdata_len;
7b80: 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ....bytes_to_cop
7b90: 79 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  y = *respdata_le
7ba0: 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63 76 5f 6c  n;....if (recv_l
7bb0: 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f  en < bytes_to_co
7bc0: 70 79 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  py) {....bytes_t
7bd0: 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65  o_copy = recv_le
7be0: 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  n;...}....CACKEY
7bf0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7c00: 6f 70 79 69 6e 67 20 25 6c 75 20 62 79 74 65 73  opying %lu bytes
7c10: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 22 2c   to the buffer",
7c20: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
7c30: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b   bytes_to_copy);
7c40: 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64  ....memcpy(respd
7c50: 61 74 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62  ata, recv_buf, b
7c60: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09  ytes_to_copy);..
7c70: 09 72 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74  .respdata += byt
7c80: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a  es_to_copy;....*
7c90: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62  respdata_len = b
7ca0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09  ytes_to_copy;...
7cb0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
7cc0: 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70   -= bytes_to_cop
7cd0: 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  y;..} else {...i
7ce0: 66 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30  f (recv_len != 0
7cf0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
7d00: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f  BUG_PRINTF("Thro
7d10: 77 69 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79  wing away %lu by
7d20: 74 65 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20  tes, nowhere to 
7d30: 70 75 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73  put them!", (uns
7d40: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76  igned long) recv
7d50: 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  _len);...}..}...
7d60: 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20  if (major_rc == 
7d70: 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20  0x61) {.../* We 
7d80: 6e 65 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a  need to READ */.
7d90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7da0: 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65  RINTF("Buffer re
7db0: 61 64 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a  ad required");..
7dc0: 09 09 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72  ..pcsc_getresp_r
7dd0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
7de0: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
7df0: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
7e00: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54   GSCIS_INSTR_GET
7e10: 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c  _RESPONSE, 0x00,
7e20: 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20   0x00, 0, NULL, 
7e30: 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f  minor_rc, respco
7e40: 64 65 2c 20 72 65 73 70 64 61 74 61 2c 20 26 74  de, respdata, &t
7e50: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  mp_respdata_len)
7e60: 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 67 65 74  ;...if (pcsc_get
7e70: 72 65 73 70 5f 72 65 74 20 21 3d 20 43 41 43 4b  resp_ret != CACK
7e80: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
7e90: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7ea0: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72  PRINTF("Buffer r
7eb0: 65 61 64 20 66 61 69 6c 65 64 21 20 20 52 65 74  ead failed!  Ret
7ec0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7ed0: 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  e");...../* End 
7ee0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
7ef0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ction */....cack
7f00: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
7f10: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65  on(slot);.....re
7f20: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7f30: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
7f40: 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 61  ....if (respdata
7f50: 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70  _len) {....*resp
7f60: 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f  data_len += tmp_
7f70: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09  respdata_len;...
7f80: 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  }..../* End Smar
7f90: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
7fa0: 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e  n */...cackey_en
7fb0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
7fc0: 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ot);....CACKEY_D
7fd0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
7fe0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
7ff0: 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63  s (buffer read c
8000: 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65  omplete)");...re
8010: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
8020: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  _S_OK);..}.../* 
8030: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
8040: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
8050: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
8060: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66  tion(slot);...if
8070: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
8080: 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65  90) {.../* Succe
8090: 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  ss */...CACKEY_D
80a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
80b0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
80c0: 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78  s (major_rc = 0x
80d0: 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  90)");....return
80e0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
80f0: 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59  K);..}....CACKEY
8100: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
8110: 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20  PDU Returned an 
8120: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67  error, returning
8130: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
8140: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8150: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
8160: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
8170: 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74  S. *     ssize_t
8180: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
8190: 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65  fer(struct cacke
81a0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
81b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
81c0: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  fer, size_t coun
81d0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
81e0: 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20   t_or_v, size_t 
81f0: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b  initial_offset);
8200: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
8210: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
8220: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8230: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
8240: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
8250: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
8260: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
8270: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
8280: 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a  [OUT] Buffer. *.
8290: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f   *     size_t co
82a0: 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e  unt. *         N
82b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
82c0: 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  o attempt to rea
82d0: 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  d. *. *     unsi
82e0: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
82f0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65  . *         Sele
8300: 63 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20  ct the T-buffer 
8310: 28 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72  (01) or V-buffer
8320: 20 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72   (02) to read fr
8330: 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20  om.  . *. *     
8340: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
8350: 66 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20  ffset. *        
8360: 20 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66   Specify the off
8370: 73 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65  set to begin the
8380: 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a   read from. *. *
8390: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
83a0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
83b0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
83c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
83d0: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c  s actually read,
83e0: 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e   or -1 on error.
83f0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
8400: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a      None. *. */.
8410: 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
8420: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
8430: 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  r(struct cackey_
8440: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
8450: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
8460: 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c  r, size_t count,
8470: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
8480: 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e  _or_v, size_t in
8490: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a  itial_offset) {.
84a0: 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d  .size_t offset =
84b0: 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20   0, max_offset, 
84c0: 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69  max_count;..unsi
84d0: 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d  gned char cmd[2]
84e0: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
84f0: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  code;..int send_
8500: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
8510: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
8520: 65 64 2e 22 29 3b 0a 0a 09 6d 61 78 5f 6f 66 66  ed.");...max_off
8530: 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61  set = count;..ma
8540: 78 5f 63 6f 75 6e 74 20 3d 20 32 35 32 3b 0a 0a  x_count = 252;..
8550: 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31  .if (t_or_v != 1
8560: 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29   && t_or_v != 2)
8570: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
8580: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
8590: 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74  d T or V paramet
85a0: 65 72 20 73 70 65 63 69 66 69 65 64 2c 20 72 65  er specified, re
85b0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
85c0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
85d0: 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d  -1);..}...cmd[0]
85e0: 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69   = t_or_v;...whi
85f0: 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f  le (1) {...if (o
8600: 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66  ffset >= max_off
8610: 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  set) {....CACKEY
8620: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
8630: 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c  uffer too small,
8640: 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20   returning what 
8650: 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09  we got...");....
8660: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63  .break;...}....c
8670: 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65  ount = max_offse
8680: 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66  t - offset;...if
8690: 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f   (count > max_co
86a0: 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20  unt) {....count 
86b0: 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d  = max_count;...}
86c0: 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75  ....cmd[1] = cou
86d0: 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20  nt;....send_ret 
86e0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
86f0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
8700: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
8710: 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54  FORM, GSCIS_INST
8720: 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28  R_READ_BUFFER, (
8730: 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20  (initial_offset 
8740: 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20  + offset) >> 8) 
8750: 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c  & 0xff, (initial
8760: 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74  _offset + offset
8770: 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  ) & 0xff, sizeof
8780: 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30  (cmd), cmd, 0x00
8790: 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66  , &respcode, buf
87a0: 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63  fer + offset, &c
87b0: 6f 75 6e 74 29 3b 0a 09 09 69 66 20 28 73 65 6e  ount);...if (sen
87c0: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
87d0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
87e0: 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20  if (respcode == 
87f0: 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66  0x6A86) {.....if
8800: 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31   (max_count == 1
8810: 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) {......break;.
8820: 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63  ....}......max_c
8830: 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74  ount = max_count
8840: 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69   / 2;......conti
8850: 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  nue;....}.....CA
8860: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8870: 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61  F("cackey_send_a
8880: 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65  pdu() failed, re
8890: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
88a0: 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  re");.....return
88b0: 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66  (-1);...}....off
88c0: 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09  set += count;...
88d0: 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78  .if (count < max
88e0: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43  _count) {....CAC
88f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8900: 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20  ("Short read -- 
8910: 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b  count = %i, cmd[
8920: 31 5d 20 3d 20 25 69 22 2c 20 63 6f 75 6e 74 2c  1] = %i", count,
8930: 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72   cmd[1]);.....br
8940: 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  eak;...}..}...CA
8950: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8960: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
8970: 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c  success, read %l
8980: 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67  u bytes", (unsig
8990: 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74  ned long) offset
89a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73  );...return(offs
89b0: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  et);.}../*. * SY
89c0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
89d0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
89e0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74  select_applet(st
89f0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
8a00: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
8a10: 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65   char *aid, size
8a20: 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a  _t aid_len);. *.
8a30: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
8a40: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
8a50: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8a60: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8a70: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8a80: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
8a90: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a  ned char *aid. *
8aa0: 20 20 20 20 20 20 20 20 20 42 75 66 66 65 72 20           Buffer 
8ab0: 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65  containing Apple
8ac0: 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20  t ID to select. 
8ad0: 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20  *. *     size_t 
8ae0: 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20  aid_len. *      
8af0: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
8b00: 65 73 20 69 6e 20 74 68 65 20 22 61 69 64 22 20  es in the "aid" 
8b10: 28 41 70 70 6c 65 74 20 49 44 29 20 70 61 72 61  (Applet ID) para
8b20: 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55  meter. *. * RETU
8b30: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
8b40: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8b50: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
8b60: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
8b70: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8b80: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
8b90: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
8ba0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  None. *. */.stat
8bb0: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
8bc0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
8bd0: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
8be0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
8bf0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
8c00: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
8c10: 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74   {..int send_ret
8c20: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
8c30: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
8c40: 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
8c50: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c  UG_PRINTBUF("Sel
8c60: 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c  ecting applet:",
8c70: 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a   aid, aid_len);.
8c80: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
8c90: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
8ca0: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
8cb0: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
8cc0: 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43  NSTR_SELECT, GSC
8cd0: 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f  IS_PARAM_SELECT_
8ce0: 41 50 50 4c 45 54 2c 20 30 78 30 43 2c 20 61 69  APPLET, 0x0C, ai
8cf0: 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30  d_len, aid, 0x00
8d00: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
8d10: 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72  LL);..if (send_r
8d20: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
8d30: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
8d40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8d50: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20  "Failed to open 
8d60: 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e  applet, returnin
8d70: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
8d80: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8d90: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
8da0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
8db0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63  BUG_PRINTF("Succ
8dc0: 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65  essfully selecte
8dd0: 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75  d file");...retu
8de0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
8df0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
8e00: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
8e10: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8e20: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72  _select_file(str
8e30: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
8e40: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20  *slot, uint16_t 
8e50: 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ef);. *. * ARGUM
8e60: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
8e70: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
8e80: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
8e90: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
8ea0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
8eb0: 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20     uint16_t ef. 
8ec0: 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e  *         Elemen
8ed0: 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65  tal File to sele
8ee0: 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ct. *. * RETURN 
8ef0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
8f00: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
8f10: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
8f20: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8f30: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
8f40: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
8f50: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
8f60: 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65  s selects an Ele
8f70: 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46  mentary File (EF
8f80: 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 72  ) under the curr
8f90: 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20  ently selected. 
8fa0: 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64 20  *     Dedicated 
8fb0: 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20  File (DF). *. * 
8fc0: 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68      Typically th
8fd0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
8fe0: 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65  er selecting the
8ff0: 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20   correct Applet 
9000: 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61  (using. *     ca
9010: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
9020: 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73  et) for VM cards
9030: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
9040: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
9050: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72  _select_file(str
9060: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9070: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20  *slot, uint16_t 
9080: 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ef) {..unsigned 
9090: 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b  char fid_buf[2];
90a0: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
90b0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
90c0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
90d0: 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ;.../* Open the 
90e0: 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20  elementary file 
90f0: 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d  */..fid_buf[0] =
9100: 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66   (ef >> 8) & 0xf
9110: 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d  f;..fid_buf[1] =
9120: 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41   ef & 0xff;...CA
9130: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9140: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c  F("Selecting fil
9150: 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69  e: %04lx", (unsi
9160: 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a  gned long) ef);.
9170: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
9180: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
9190: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
91a0: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
91b0: 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30  NSTR_SELECT, 0x0
91c0: 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28  2, 0x0C, sizeof(
91d0: 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75  fid_buf), fid_bu
91e0: 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e  f, 0x00, NULL, N
91f0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
9200: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
9210: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
9220: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9230: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
9240: 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74  o open file, ret
9250: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
9260: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
9270: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9280: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
9290: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
92a0: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
92b0: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
92c0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
92d0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
92e0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
92f0: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
9300: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
9310: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
9320: 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20  y *root);. *. * 
9330: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
9340: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74   struct cackey_t
9350: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a  lv_entity *root.
9360: 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20   *         Root 
9370: 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20  of the TLV list 
9380: 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e 67  to start freeing
9390: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
93a0: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
93b0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
93c0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
93d0: 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c   frees the TLV l
93e0: 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74  inked listed ret
93f0: 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20  urned from. *   
9400: 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74    "cackey_read_t
9410: 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  lv". *. */.stati
9420: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
9430: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ee_tlv(struct ca
9440: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
9450: 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *root) {..struct
9460: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
9470: 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b  ty *curr, *next;
9480: 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e  ...if (root == N
9490: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  ULL) {...return;
94a0: 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20  ..}...for (curr 
94b0: 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75  = root; curr; cu
94c0: 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e  rr = next) {...n
94d0: 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78  ext = curr->_nex
94e0: 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  t;....switch (cu
94f0: 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61  rr->tag) {....ca
9500: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52  se GSCIS_TAG_ACR
9510: 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20  _TABLE:....case 
9520: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
9530: 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63  ICATE:.....if (c
9540: 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09  urr->value) {...
9550: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61  ...free(curr->va
9560: 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  lue);.....}.....
9570: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
9580: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
9590: 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e  :.....if (curr->
95a0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b  value_cardurl) {
95b0: 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d  ......free(curr-
95c0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b  >value_cardurl);
95d0: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
95e0: 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75  ;...}....free(cu
95f0: 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  rr);..}...return
9600: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
9610: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
9620: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
9630: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
9640: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
9650: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
9660: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
9670: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  *. */.static str
9680: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
9690: 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65  ntity *cackey_re
96a0: 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ad_tlv(struct ca
96b0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
96c0: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
96d0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75  y_tlv_entity *cu
96e0: 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74  rr_entity, *root
96f0: 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d   = NULL, *last =
9700: 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64   NULL;..unsigned
9710: 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32   char tlen_buf[2
9720: 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34  ], tval_buf[1024
9730: 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *tval;..unsig
9740: 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75  ned char vlen_bu
9750: 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38  f[2], vval_buf[8
9760: 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e  192], *vval;..un
9770: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70  signed char *tmp
9780: 62 75 66 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c  buf;..ssize_t tl
9790: 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65  en, vlen;..ssize
97a0: 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69  _t read_ret;..si
97b0: 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20  ze_t offset_t = 
97c0: 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b  0, offset_v = 0;
97d0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
97e0: 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  tag;..size_t len
97f0: 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45  gth;.#ifdef HAVE
9800: 5f 4c 49 42 5a 0a 09 75 4c 6f 6e 67 66 20 74 6d  _LIBZ..uLongf tm
9810: 70 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20 75 6e  pbuflen;..int un
9820: 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65  compress_ret;.#e
9830: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
9840: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
9850: 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65  ed.");...read_re
9860: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
9870: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65  buffer(slot, tle
9880: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c  n_buf, sizeof(tl
9890: 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73  en_buf), 1, offs
98a0: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
98b0: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74  _ret != sizeof(t
98c0: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  len_buf)) {...CA
98d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
98e0: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20  F("Read failed, 
98f0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
9900: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
9910: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c  n(NULL);..}...tl
9920: 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31  en = (tlen_buf[1
9930: 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62  ] << 8) | tlen_b
9940: 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65  uf[0];...read_re
9950: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
9960: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65  buffer(slot, vle
9970: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c  n_buf, sizeof(vl
9980: 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73  en_buf), 2, offs
9990: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
99a0: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76  _ret != sizeof(v
99b0: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  len_buf)) {...CA
99c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
99d0: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20  F("Read failed, 
99e0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
99f0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
9a00: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c  n(NULL);..}...vl
9a10: 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31  en = (vlen_buf[1
9a20: 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62  ] << 8) | vlen_b
9a30: 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f  uf[0];...CACKEY_
9a40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
9a50: 67 20 4c 65 6e 67 74 68 20 3d 20 25 69 2c 20 56  g Length = %i, V
9a60: 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 69  alue Length = %i
9a70: 22 2c 20 74 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a  ", tlen, vlen);.
9a80: 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b  ..offset_t += 2;
9a90: 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b  ..offset_v += 2;
9aa0: 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69  ...if (tlen > si
9ab0: 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20  zeof(tval_buf)) 
9ac0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
9ad0: 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e  _PRINTF("Tag len
9ae0: 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  gth is too large
9af0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
9b00: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9b10: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
9b20: 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f  if (vlen > sizeo
9b30: 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09  f(vval_buf)) {..
9b40: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9b50: 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67  INTF("Value leng
9b60: 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c  th is too large,
9b70: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
9b80: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
9b90: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72  rn(NULL);..}...r
9ba0: 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ead_ret = cackey
9bb0: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f  _read_buffer(slo
9bc0: 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65  t, tval_buf, tle
9bd0: 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b  n, 1, offset_t);
9be0: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
9bf0: 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b  = tlen) {...CACK
9c00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9c10: 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20  "Unable to read 
9c20: 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c  entire T-buffer,
9c30: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
9c40: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
9c50: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72  rn(NULL);..}...r
9c60: 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ead_ret = cackey
9c70: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f  _read_buffer(slo
9c80: 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65  t, vval_buf, vle
9c90: 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b  n, 2, offset_v);
9ca0: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
9cb0: 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b  = vlen) {...CACK
9cc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9cd0: 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20  "Unable to read 
9ce0: 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c  entire V-buffer,
9cf0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
9d00: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
9d10: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74  rn(NULL);..}...t
9d20: 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a  val = tval_buf;.
9d30: 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66  .vval = vval_buf
9d40: 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e  ;..while (tlen >
9d50: 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20   0 && vlen > 0) 
9d60: 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b  {...tag = *tval;
9d70: 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65  ...tval++;...tle
9d80: 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61  n--;....if (*tva
9d90: 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09  l == 0xff) {....
9da0: 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32  length = (tval[2
9db0: 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31  ] << 8) | tval[1
9dc0: 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b  ];....tval += 3;
9dd0: 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09  ....tlen -= 3;..
9de0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e  .} else {....len
9df0: 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09  gth = *tval;....
9e00: 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d  tval++;....tlen-
9e10: 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  -;...}....CACKEY
9e20: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
9e30: 61 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20  ag: %s (%02x)", 
9e40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
9e50: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67  C_TAG_TO_STR(tag
9e60: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ), (unsigned int
9e70: 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59  ) tag);...CACKEY
9e80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
9e90: 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20  "Value:", vval, 
9ea0: 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72  length);....curr
9eb0: 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a  _entity = NULL;.
9ec0: 09 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b  ..switch (tag) {
9ed0: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
9ee0: 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09  AG_CARDURL:.....
9ef0: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
9f00: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
9f10: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  r_entity));.....
9f20: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
9f30: 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c  ue_cardurl = mal
9f40: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
9f50: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
9f60: 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d  ardurl));......m
9f70: 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74  emcpy(curr_entit
9f80: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
9f90: 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b  ->rid, vval, 5);
9fa0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
9fb0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
9fc0: 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b  >apptype = vval[
9fd0: 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  5];.....curr_ent
9fe0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
9ff0: 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28  rl->objectid = (
a000: 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20  vval[6] << 8) | 
a010: 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72  vval[7];.....cur
a020: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
a030: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d  cardurl->appid =
a040: 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20   (vval[8] << 8) 
a050: 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09  | vval[9];......
a060: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
a070: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
a080: 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d  _entity->_next =
a090: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61   NULL;......brea
a0a0: 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53  k;....case GSCIS
a0b0: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a  _TAG_ACR_TABLE:.
a0c0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
a0d0: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
a0e0: 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
a0f0: 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c  ....tmpbuf = mal
a100: 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09  loc(length);....
a110: 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c  ..memcpy(tmpbuf,
a120: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
a130: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a140: 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09  ->tag = tag;....
a150: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65  .curr_entity->le
a160: 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  ngth = length;..
a170: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a180: 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a  value = tmpbuf;.
a190: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
a1a0: 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a  >_next = NULL;..
a1b0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
a1c0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  se GSCIS_TAG_CER
a1d0: 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75  TIFICATE:.....cu
a1e0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
a1f0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
a200: 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 74  entity));......t
a210: 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74  mpbuflen = lengt
a220: 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75  h * 2;.....tmpbu
a230: 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
a240: 66 6c 65 6e 29 3b 0a 0a 23 69 66 64 65 66 20 48  flen);..#ifdef H
a250: 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 75 6e 63  AVE_LIBZ.....unc
a260: 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e  ompress_ret = un
a270: 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c  compress(tmpbuf,
a280: 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61   &tmpbuflen, vva
a290: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09  l, length);.....
a2a0: 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72  if (uncompress_r
a2b0: 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09  et != Z_OK) {...
a2c0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a2d0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
a2e0: 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e  o decompress, un
a2f0: 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72  compress() retur
a300: 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74  ned %i -- resort
a310: 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f  ing to direct co
a320: 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f  py", uncompress_
a330: 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62  ret);.......tmpb
a340: 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a  uflen = length;.
a350: 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62  .....memcpy(tmpb
a360: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  uf, vval, length
a370: 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
a380: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a390: 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65  BUF("Decompresse
a3a0: 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20  d to:", tmpbuf, 
a3b0: 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73  tmpbuflen);.#els
a3c0: 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  e.....CACKEY_DEB
a3d0: 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69  UG_PRINTF("Missi
a3e0: 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c  ng ZLIB Support,
a3f0: 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74   this certificat
a400: 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c  e is likely usel
a410: 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74  ess...");......t
a420: 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74  mpbuflen = lengt
a430: 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  h;.....memcpy(tm
a440: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
a450: 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09  th);.#endif.....
a460: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
a470: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
a480: 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68  r_entity->length
a490: 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09   = tmpbuflen;...
a4a0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
a4b0: 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09  alue = tmpbuf;..
a4c0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a4d0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
a4e0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
a4f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  e GSCIS_TAG_PKCS
a500: 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  15:.....curr_ent
a510: 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ity = malloc(siz
a520: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
a530: 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e  ));......curr_en
a540: 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b  tity->tag = tag;
a550: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a560: 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76  ->value_byte = v
a570: 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72  val[0];.....curr
a580: 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d  _entity->_next =
a590: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61   NULL;......brea
a5a0: 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b  k;...}....vval +
a5b0: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e  = length;...vlen
a5c0: 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69   -= length;....i
a5d0: 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21  f (curr_entity !
a5e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20  = NULL) {....if 
a5f0: 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (root == NULL) {
a600: 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72  .....root = curr
a610: 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09  _entity;....}...
a620: 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55  ..if (last != NU
a630: 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e  LL) {.....last->
a640: 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74  _next = curr_ent
a650: 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61  ity;....}.....la
a660: 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79  st = curr_entity
a670: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72  ;...}..}...retur
a680: 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  n(root);.}../*. 
a690: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
a6a0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
a6b0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
a6c0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
a6d0: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
a6e0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
a6f0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
a700: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
a710: 66 72 65 65 5f 63 65 72 74 73 28 73 74 72 75 63  free_certs(struc
a720: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
a730: 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73  entity *start, s
a740: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74  ize_t count, int
a750: 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09   free_start) {..
a760: 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 66 6f  size_t idx;...fo
a770: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
a780: 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  < count; idx++) 
a790: 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64  {...if (start[id
a7a0: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20  x].certificate) 
a7b0: 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b  {....free(start[
a7c0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
a7d0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
a7e0: 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09  free_start) {...
a7f0: 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a  free(start);..}.
a800: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
a810: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
a820: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
a830: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
a840: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
a850: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
a860: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
a870: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
a880: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
a890: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
a8a0: 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65   *cackey_read_ce
a8b0: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
a8c0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74  y_slot *slot, st
a8d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
a8e0: 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73  _identity *certs
a8f0: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
a900: 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  *count) {..struc
a910: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
a920: 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
a930: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
a940: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f  tlv_entity *ccc_
a950: 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20  tlv, *ccc_curr, 
a960: 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63  *app_tlv, *app_c
a970: 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  urr;..unsigned c
a980: 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20  har ccc_aid[] = 
a990: 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b  {GSCIS_AID_CCC};
a9a0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
a9b0: 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e  curr_aid[7];..un
a9c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69  signed long outi
a9d0: 64 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f  dx = 0;..cackey_
a9e0: 72 65 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ret transaction_
a9f0: 72 65 74 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f  ret;..int certs_
aa00: 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20  resizable;..int 
aa10: 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74  send_ret, select
aa20: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
aa30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
aa40: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f  led.");...if (co
aa50: 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
aa60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
aa70: 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e  INTF("count is N
aa80: 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ULL, returning i
aa90: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
aaa0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
aab0: 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d 20  ...if (certs != 
aac0: 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63  NULL) {...if (*c
aad0: 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09  ount == 0) {....
aae0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
aaf0: 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20 77  NTF("Requested w
ab00: 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63  e return 0 objec
ab10: 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69  ts, short-circui
ab20: 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
ab30: 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  certs);...}..}..
ab40: 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d 61 72  ./* Begin a Smar
ab50: 74 43 61 72 64 20 74 72 61 6e 73 61 63 74 69 6f  tCard transactio
ab60: 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f  n */..transactio
ab70: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 62  n_ret = cackey_b
ab80: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
ab90: 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74 72 61  (slot);..if (tra
aba0: 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20  nsaction_ret != 
abb0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
abc0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
abd0: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
abe0: 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  e begin transact
abf0: 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ion, returning i
ac00: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
ac10: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
ac20: 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20  ...if (certs == 
ac30: 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20  NULL) {...certs 
ac40: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
ac50: 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09  *certs) * 5);...
ac60: 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65  *count = 5;...ce
ac70: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20  rts_resizable = 
ac80: 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63  1;..} else {...c
ac90: 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d  erts_resizable =
aca0: 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65   0;..}.../* Sele
acb0: 63 74 20 74 68 65 20 43 43 43 20 41 70 70 6c 65  ct the CCC Apple
acc0: 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d  t */..send_ret =
acd0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
ace0: 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f  pplet(slot, ccc_
acf0: 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f  aid, sizeof(ccc_
ad00: 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64  aid));..if (send
ad10: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
ad20: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
ad30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ad40: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c  F("Unable to sel
ad50: 65 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20  ect CCC Applet, 
ad60: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ad70: 6c 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20 54 65  lure");..../* Te
ad80: 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72  rminate SmartCar
ad90: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
ada0: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
adb0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
adc0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
add0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64 20 61  ;..}.../* Read a
ade0: 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73 20 66  ll the applets f
adf0: 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c  rom the CCC's TL
ae00: 56 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20 3d 20  V */..ccc_tlv = 
ae10: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
ae20: 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b  slot);.../* Look
ae30: 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68   for CARDURLs th
ae40: 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f  at coorespond to
ae50: 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a   PKI applets */.
ae60: 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d  .for (ccc_curr =
ae70: 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75   ccc_tlv; ccc_cu
ae80: 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63  rr; ccc_curr = c
ae90: 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20  cc_curr->_next) 
aea0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
aeb0: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
aec0: 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41  ag: %s ... ", CA
aed0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
aee0: 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  TAG_TO_STR(ccc_c
aef0: 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 69  urr->tag));....i
af00: 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67  f (ccc_curr->tag
af10: 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41   != GSCIS_TAG_CA
af20: 52 44 55 52 4c 29 20 7b 0a 09 09 09 43 41 43 4b  RDURL) {....CACK
af30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
af40: 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
af50: 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
af60: 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29   about CARDURLs)
af70: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
af80: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 63 63  ;...}....if ((cc
af90: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
afa0: 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26  rdurl->apptype &
afb0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
afc0: 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54  PKI) != CACKEY_T
afd0: 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09  LV_APP_PKI) {...
afe0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
aff0: 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
b000: 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
b010: 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20   care about PKI 
b020: 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70  applets, this ap
b030: 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25  plet supports: %
b040: 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59  s/%02x)", CACKEY
b050: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
b060: 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  YPE_TO_STR(ccc_c
b070: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
b080: 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75  rl->apptype), (u
b090: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63  nsigned int) ccc
b0a0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b0b0: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a  durl->apptype);.
b0c0: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
b0d0: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
b0e0: 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a  G_PRINTBUF("RID:
b0f0: 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  ", ccc_curr->val
b100: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
b110: 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72   sizeof(ccc_curr
b120: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
b130: 3e 72 69 64 29 29 3b 0a 09 09 43 41 43 4b 45 59  >rid));...CACKEY
b140: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
b150: 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ppID = %s/%04lx"
b160: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
b170: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
b180: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
b190: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29  _cardurl->appid)
b1a0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b1b0: 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
b1c0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
b1d0: 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
b1e0: 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74  G_PRINTF("Object
b1f0: 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20  ID = %s/%04lx", 
b200: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
b210: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63  C_OBJID_TO_STR(c
b220: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
b230: 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64  ardurl->objectid
b240: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
b250: 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  g) ccc_curr->val
b260: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
b270: 63 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63 70 79  ctid);....memcpy
b280: 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63  (curr_aid, ccc_c
b290: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
b2a0: 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28  rl->rid, sizeof(
b2b0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
b2c0: 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a  cardurl->rid));.
b2d0: 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f  ..curr_aid[sizeo
b2e0: 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d  f(curr_aid) - 2]
b2f0: 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61   = (ccc_curr->va
b300: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
b310: 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  id >> 8) & 0xff;
b320: 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65  ...curr_aid[size
b330: 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31  of(curr_aid) - 1
b340: 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ] = ccc_curr->va
b350: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
b360: 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09 2f 2a  id & 0xff;..../*
b370: 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70   Select found ap
b380: 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 73 65  plet ... */...se
b390: 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  lect_ret = cacke
b3a0: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
b3b0: 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20  slot, curr_aid, 
b3c0: 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
b3d0: 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f  );...if (select_
b3e0: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
b3f0: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
b400: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b410: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c  F("Failed to sel
b420: 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70  ect applet, skip
b430: 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20  ping processing 
b440: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29  of this object")
b450: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
b460: 09 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20 61 6e  ..}..../* ... an
b470: 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20  d object (file) 
b480: 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20  */...select_ret 
b490: 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  = cackey_select_
b4a0: 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63  file(slot, ccc_c
b4b0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
b4c0: 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09  rl->objectid);..
b4d0: 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20  .if (select_ret 
b4e0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
b4f0: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
b500: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
b510: 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20  ailed to select 
b520: 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70  file, skipping p
b530: 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69  rocessing of thi
b540: 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  s object");.....
b550: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
b560: 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73  ./* Process this
b570: 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b   file's TLV look
b580: 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69 63  ing for certific
b590: 61 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f 74 6c  ates */...app_tl
b5a0: 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  v = cackey_read_
b5b0: 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 66 6f  tlv(slot);....fo
b5c0: 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70  r (app_curr = ap
b5d0: 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b  p_tlv; app_curr;
b5e0: 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f   app_curr = app_
b5f0: 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09  curr->_next) {..
b600: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b610: 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67  RINTF("Found tag
b620: 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45  : %s", CACKEY_DE
b630: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
b640: 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61  STR(app_curr->ta
b650: 67 29 29 3b 0a 09 09 09 69 66 20 28 61 70 70 5f  g));....if (app_
b660: 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43  curr->tag != GSC
b670: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
b680: 54 45 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  TE) {.....CACKEY
b690: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
b6a0: 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74   ... skipping it
b6b0: 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61   (we only care a
b6c0: 62 6f 75 74 20 43 45 52 54 49 46 49 43 41 54 45  bout CERTIFICATE
b6d0: 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69  s)");......conti
b6e0: 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75  nue;....}.....cu
b6f0: 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f  rr_id = &certs[o
b700: 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64  utidx];....outid
b710: 78 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28  x++;.....memcpy(
b720: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c  curr_id->applet,
b730: 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f   curr_aid, sizeo
b740: 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  f(curr_id->apple
b750: 74 29 29 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d  t));....curr_id-
b760: 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72  >file = ccc_curr
b770: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
b780: 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 63 75  >objectid;....cu
b790: 72 72 5f 69 64 2d 3e 6c 61 62 65 6c 20 3d 20 4e  rr_id->label = N
b7a0: 55 4c 4c 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64  ULL;.....curr_id
b7b0: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
b7c0: 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65  n = app_curr->le
b7d0: 6e 67 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f 69  ngth;.....curr_i
b7e0: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d  d->certificate =
b7f0: 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d   malloc(curr_id-
b800: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
b810: 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  );....memcpy(cur
b820: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
b830: 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c  e, app_curr->val
b840: 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72  ue, curr_id->cer
b850: 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a  tificate_len);..
b860: 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d  ...if (outidx >=
b870: 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 69   *count) {.....i
b880: 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62  f (certs_resizab
b890: 6c 65 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e  le) {......*coun
b8a0: 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65 72  t *= 2;......cer
b8b0: 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72  ts = realloc(cer
b8c0: 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74  ts, sizeof(*cert
b8d0: 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a  s) * (*count));.
b8e0: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
b8f0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09  ..break;.....}..
b900: 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  ..}...}....cacke
b910: 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f 74  y_free_tlv(app_t
b920: 6c 76 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74 69  lv);....if (outi
b930: 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a  dx >= *count) {.
b940: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
b950: 0a 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74  ...cackey_free_t
b960: 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09 2a  lv(ccc_tlv);...*
b970: 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a  count = outidx;.
b980: 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 69  ..if (certs_resi
b990: 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73  zable) {...certs
b9a0: 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73   = realloc(certs
b9b0: 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  , sizeof(*certs)
b9c0: 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d   * (*count));..}
b9d0: 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20  .../* Terminate 
b9e0: 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61  SmartCard Transa
b9f0: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
ba00: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
ba10: 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e  (slot);...return
ba20: 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20  (certs);.}../*. 
ba30: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
ba40: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
ba50: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
ba60: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
ba70: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
ba80: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
ba90: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
baa0: 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
bab0: 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73  ey_signdecrypt(s
bac0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
bad0: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
bae0: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a  d char *buf, siz
baf0: 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69  e_t buflen, unsi
bb00: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75  gned char *outbu
bb10: 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66  f, size_t outbuf
bb20: 6c 65 6e 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72  len) {..cackey_r
bb30: 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  et send_ret;...C
bb40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bb50: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
bb60: 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 32 35  .if (buflen > 25
bb70: 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  5) {...CACKEY_DE
bb80: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
bb90: 72 2e 20 20 62 75 66 6c 65 6e 20 69 73 20 67 72  r.  buflen is gr
bba0: 65 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 28  eater than 255 (
bbb0: 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20  buflen = %lu)", 
bbc0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
bbd0: 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  buflen);....retu
bbe0: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
bbf0: 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20 32 35 35  (outbuflen > 255
bc00: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
bc10: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
bc20: 2e 20 20 6f 75 74 62 75 66 6c 65 6e 20 69 73 20  .  outbuflen is 
bc30: 67 72 61 74 65 72 20 74 68 61 6e 20 32 35 35 20  grater than 255 
bc40: 28 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75  (outbuflen = %lu
bc50: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
bc60: 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a  ng) outbuflen);.
bc70: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
bc80: 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20  }...if (slot == 
bc90: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
bca0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
bcb0: 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e  rror.  slot is N
bcc0: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
bcd0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62  (-1);..}...if (b
bce0: 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
bcf0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bd00: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62 75 66  NTF("Error.  buf
bd10: 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
bd20: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
bd30: 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55  if (outbuf == NU
bd40: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
bd50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
bd60: 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 73 20 4e  or.  outbuf is N
bd70: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
bd80: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 65 6e 64 5f  (-1);..}...send_
bd90: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
bda0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
bdb0: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
bdc0: 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f  PLATFORM, GSCIS_
bdd0: 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50  INSTR_SIGNDECRYP
bde0: 54 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 62  T, 0x00, 0x00, b
bdf0: 75 66 6c 65 6e 2c 20 62 75 66 2c 20 6f 75 74 62  uflen, buf, outb
be00: 75 66 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 6f 75 74  uflen, NULL, out
be10: 62 75 66 2c 20 26 6f 75 74 62 75 66 6c 65 6e 29  buf, &outbuflen)
be20: 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ;..if (send_ret 
be30: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
be40: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
be50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
be60: 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65  PU Sending Faile
be70: 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69  d -- returning i
be80: 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 72  n error.");....r
be90: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
bea0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
beb0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
bec0: 6e 20 73 75 63 63 65 73 73 2e 22 29 3b 0a 0a 09  n success.");...
bed0: 72 65 74 75 72 6e 28 6f 75 74 62 75 66 6c 65 6e  return(outbuflen
bee0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
bef0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
bf00: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
bf10: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
bf20: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
bf30: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
bf40: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
bf50: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
bf60: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
bf70: 6c 6f 67 69 6e 28 73 74 72 75 63 74 20 63 61 63  login(struct cac
bf80: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
bf90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
bfa0: 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  in, unsigned lon
bfb0: 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a  g pin_len, int *
bfc0: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
bfd0: 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  p) {..unsigned c
bfe0: 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d  har cac_pin[8] =
bff0: 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78   {0xFF, 0xFF, 0x
c000: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
c010: 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
c020: 7d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73  };..uint16_t res
c030: 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74  ponse_code;..int
c040: 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
c050: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
c060: 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74  .../* Indicate t
c070: 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  hat we do not kn
c080: 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e  ow about how man
c090: 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61  y tries are rema
c0a0: 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72  ining */..if (tr
c0b0: 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
c0c0: 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61   {...*tries_rema
c0d0: 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d  ining_p = -1;..}
c0e0: 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79  .../* Apparently
c0f0: 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a  , CAC PINs are *
c100: 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73  EXACTLY* 8 bytes
c110: 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74   long -- pad wit
c120: 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68  h 0xFF if too sh
c130: 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f  ort */..if (pin_
c140: 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65  len >= 8) {...me
c150: 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
c160: 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  n, 8);..} else {
c170: 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69  ...memcpy(cac_pi
c180: 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29  n, pin, pin_len)
c190: 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20  ;..}.../* Issue 
c1a0: 50 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73  PIN Verify */..s
c1b0: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
c1c0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
c1d0: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
c1e0: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
c1f0: 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20  R_VERIFY, 0x00, 
c200: 30 78 30 30 2c 20 73 69 7a 65 6f 66 28 63 61 63  0x00, sizeof(cac
c210: 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20  _pin), cac_pin, 
c220: 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f  0x00, &response_
c230: 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  code, NULL, NULL
c240: 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  );..if (send_ret
c250: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
c260: 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72  S_OK) {...if ((r
c270: 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
c280: 78 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30  x63C0) == 0x63C0
c290: 29 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d  ) {....tries_rem
c2a0: 61 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e  aining = (respon
c2b0: 73 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a  se_code & 0xF);.
c2c0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
c2d0: 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
c2e0: 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64  ification failed
c2f0: 2c 20 25 69 20 74 72 69 65 73 20 72 65 6d 61 69  , %i tries remai
c300: 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d  ning", tries_rem
c310: 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20  aining);.....if 
c320: 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  (tries_remaining
c330: 5f 70 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73  _p) {.....*tries
c340: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74  _remaining_p = t
c350: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
c360: 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28  ...}.....return(
c370: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
c380: 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  DPIN);...}....if
c390: 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20   (response_code 
c3a0: 3d 3d 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09  == 0x6983) {....
c3b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c3c0: 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63  NTF("PIN Verific
c3d0: 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65  ation failed, de
c3e0: 76 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29  vice is locked")
c3f0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
c400: 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
c410: 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  D);...}....retur
c420: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
c430: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
c440: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c450: 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
c460: 74 69 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29  tion succeeded")
c470: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
c480: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
c490: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
c4a0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
c4b0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
c4c0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
c4d0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
c4e0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
c4f0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
c500: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
c510: 72 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  ret cackey_token
c520: 5f 70 72 65 73 65 6e 74 28 73 74 72 75 63 74 20  _present(struct 
c530: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
c540: 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  t) {..unsigned c
c550: 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20  har ccc_aid[] = 
c560: 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b  {GSCIS_AID_CCC};
c570: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
c580: 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20  ../* Select the 
c590: 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73  CCC Applet */..s
c5a0: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
c5b0: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
c5c0: 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69  lot, ccc_aid, si
c5d0: 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a  zeof(ccc_aid));.
c5e0: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
c5f0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
c600: 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41  K) {...return(CA
c610: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
c620: 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 72  NABSENT);..}...r
c630: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
c640: 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
c650: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
c660: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
c670: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
c680: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
c690: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
c6a0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
c6b0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
c6c0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
c6d0: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63 73  ize_t cackey_pcs
c6e0: 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61  c_identity_to_la
c6f0: 62 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b 65  bel(struct cacke
c700: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
c710: 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67  *identity, unsig
c720: 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f  ned char *label_
c730: 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  buf, unsigned lo
c740: 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e  ng label_buf_len
c750: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
c760: 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ng certificate_l
c770: 65 6e 3b 0a 09 63 68 61 72 20 2a 6c 61 62 65 6c  en;..char *label
c780: 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65  _asn1;..void *ce
c790: 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74 20  rtificate;..int 
c7a0: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a  x509_read_ret;..
c7b0: 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69  .certificate = i
c7c0: 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
c7d0: 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61  cate;..certifica
c7e0: 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74  te_len = identit
c7f0: 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  y->certificate_l
c800: 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66  en;...if (certif
c810: 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b  icate_len < 0) {
c820: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c830: 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65  }...x509_read_re
c840: 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a  t = x509_to_subj
c850: 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c  ect(certificate,
c860: 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
c870: 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62  , (void **) &lab
c880: 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28 78  el_asn1);..if (x
c890: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
c8a0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  ) {...return(-1)
c8b0: 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64  ;..}...x509_read
c8c0: 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74  _ret = x509_dn_t
c8d0: 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61  o_string(label_a
c8e0: 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72  sn1, x509_read_r
c8f0: 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62  et, (char *) lab
c900: 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75  el_buf, label_bu
c910: 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69  f_len, "CN");..i
c920: 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
c930: 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39 5f   <= 0) {...x509_
c940: 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
c950: 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62  dn_to_string(lab
c960: 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65  el_asn1, x509_re
c970: 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29  ad_ret, (char *)
c980: 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65   label_buf, labe
c990: 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29  l_buf_len, NULL)
c9a0: 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72 65  ;....if (x509_re
c9b0: 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
c9c0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
c9d0: 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 78 35  }..}...return(x5
c9e0: 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a  09_read_ret);.}.
c9f0: 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
ca00: 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
ca10: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
ca20: 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64 20  tex_create(void 
ca30: 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72  **mutex) {..pthr
ca40: 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68  ead_mutex_t *pth
ca50: 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74  read_mutex;..int
ca60: 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b   pthread_retval;
ca70: 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72  ..CK_RV custom_r
ca80: 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
ca90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
caa0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
cab0: 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
cac0: 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49  s & CKF_OS_LOCKI
cad0: 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53  NG_OK) == CKF_OS
cae0: 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09  _LOCKING_OK) {..
caf0: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d  .pthread_mutex =
cb00: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
cb10: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29 3b  pthread_mutex));
cb20: 0a 09 09 69 66 20 28 21 70 74 68 72 65 61 64 5f  ...if (!pthread_
cb30: 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43 4b  mutex) {....CACK
cb40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
cb50: 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63  "Failed to alloc
cb60: 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a  ate memory.");..
cb70: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
cb80: 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  .}....pthread_re
cb90: 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d  tval = pthread_m
cba0: 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65 61  utex_init(pthrea
cbb0: 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a  d_mutex, NULL);.
cbc0: 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65  ..if (pthread_re
cbd0: 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
cbe0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
cbf0: 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74  NTF("pthread_mut
cc00: 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72 6e  ex_init() return
cc10: 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c  ed error (%i).",
cc20: 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29   pthread_retval)
cc30: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
cc40: 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20  ;...}....*mutex 
cc50: 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b  = pthread_mutex;
cc60: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
cc70: 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  (cackey_args.Cre
cc80: 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ateMutex) {....c
cc90: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
cca0: 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
ccb0: 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a  eMutex(mutex);..
ccc0: 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65  ...if (custom_re
ccd0: 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  tval != CKR_OK) 
cce0: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
ccf0: 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
cd00: 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
cd10: 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
cd20: 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
cd30: 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
cd40: 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
cd50: 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
cd60: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cd70: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
cd80: 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
cd90: 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
cda0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
cdb0: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
cdc0: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
cdd0: 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69  y_mutex_lock(voi
cde0: 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68  d *mutex) {..pth
cdf0: 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
ce00: 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
ce10: 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
ce20: 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
ce30: 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
ce40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
ce50: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
ce60: 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
ce70: 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
ce80: 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
ce90: 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
cea0: 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
ceb0: 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72  = mutex;....pthr
cec0: 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68  ead_retval = pth
ced0: 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
cee0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a  pthread_mutex);.
cef0: 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65  ..if (pthread_re
cf00: 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
cf10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
cf20: 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74  NTF("pthread_mut
cf30: 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e  ex_lock() return
cf40: 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c  ed error (%i).",
cf50: 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29   pthread_retval)
cf60: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
cf70: 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
cf80: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67  ..if (cackey_arg
cf90: 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09  s.LockMutex) {..
cfa0: 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20  ..custom_retval 
cfb0: 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f  = cackey_args.Lo
cfc0: 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  ckMutex(mutex);.
cfd0: 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
cfe0: 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
cff0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
d000: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
d010: 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
d020: 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
d030: 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
d040: 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
d050: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
d060: 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
d070: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d080: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
d090: 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
d0a0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
d0b0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30  .}../* Returns 0
d0c0: 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73   on success */.s
d0d0: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
d0e0: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f  _mutex_unlock(vo
d0f0: 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74  id *mutex) {..pt
d100: 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
d110: 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69  thread_mutex;..i
d120: 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  nt pthread_retva
d130: 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d  l;..CK_RV custom
d140: 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
d150: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d160: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
d170: 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ((cackey_args.fl
d180: 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags & CKF_OS_LOC
d190: 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f  KING_OK) == CKF_
d1a0: 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b  OS_LOCKING_OK) {
d1b0: 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
d1c0: 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68   = mutex;....pth
d1d0: 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
d1e0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
d1f0: 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ck(pthread_mutex
d200: 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64  );...if (pthread
d210: 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
d220: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d230: 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f  PRINTF("pthread_
d240: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72  mutex_unlock() r
d250: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
d260: 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
d270: 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
d280: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n(-1);...}..} el
d290: 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
d2a0: 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
d2b0: 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
d2c0: 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
d2d0: 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
d2e0: 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20  (mutex);.....if 
d2f0: 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21  (custom_retval !
d300: 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
d310: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d320: 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73  NTF("cackey_args
d330: 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72  .UnlockMutex() r
d340: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
d350: 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75  li).", (long) cu
d360: 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  stom_retval);...
d370: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
d380: 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  ..}...}..}...CAC
d390: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d3a0: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65  ("Returning suce
d3b0: 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a  ssfully (0)");..
d3c0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73  .return(0);.}..s
d3d0: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
d3e0: 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65  y_free_identitie
d3f0: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
d400: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
d410: 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  ties, unsigned l
d420: 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63  ong identities_c
d430: 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52  ount) {..CK_ATTR
d440: 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
d450: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
d460: 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64   id_idx, attr_id
d470: 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  x;...if (identit
d480: 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69  ies == NULL || i
d490: 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
d4a0: 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e  == 0) {...return
d4b0: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69  ;..}...for (id_i
d4c0: 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c  dx = 0; id_idx <
d4d0: 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
d4e0: 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09  t; id_idx++) {..
d4f0: 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
d500: 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
d510: 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74  es) {....for (at
d520: 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
d530: 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65  _idx < identitie
d540: 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
d550: 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72  utes_count; attr
d560: 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75  _idx++) {.....cu
d570: 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74  rr_attr = &ident
d580: 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
d590: 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64  tributes[attr_id
d5a0: 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72  x];......if (cur
d5b0: 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20  r_attr->pValue) 
d5c0: 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
d5d0: 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a  _attr->pValue);.
d5e0: 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 66  ....}....}.....f
d5f0: 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69  ree(identities[i
d600: 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
d610: 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65  s);...}..}...fre
d620: 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d  e(identities);.}
d630: 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52  ..static CK_ATTR
d640: 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79  IBUTE_PTR cackey
d650: 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
d660: 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20  CK_OBJECT_CLASS 
d670: 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72  objectclass, str
d680: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
d690: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
d6a0: 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ty, unsigned lon
d6b0: 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20  g identity_num, 
d6c0: 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
d6d0: 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63  Count) {..static
d6e0: 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75   CK_BBOOL ck_tru
d6f0: 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43  e = 1;..static C
d700: 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65  K_BBOOL ck_false
d710: 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20   = 0;..CK_ULONG 
d720: 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65  numattrs = 0, re
d730: 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f  tval_count;..CK_
d740: 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63  ATTRIBUTE_TYPE c
d750: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
d760: 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72  CK_ATTRIBUTE cur
d770: 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b  r_attr, *retval;
d780: 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56  ..CK_VOID_PTR pV
d790: 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  alue;..CK_ULONG 
d7a0: 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f  ulValueLen;..CK_
d7b0: 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f  OBJECT_CLASS ck_
d7c0: 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43  object_class;..C
d7d0: 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
d7e0: 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74  PE ck_certificat
d7f0: 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f  e_type;..CK_KEY_
d800: 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65  TYPE ck_key_type
d810: 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75  ;..CK_UTF8CHAR u
d820: 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09  cTmpBuf[1024];..
d830: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
d840: 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69  ertificate;..ssi
d850: 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65  ze_t certificate
d860: 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f  _len = -1, x509_
d870: 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70  read_ret;..int p
d880: 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41  Value_free;...CA
d890: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d8a0: 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63  F("Called (objec
d8b0: 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64  tClass = %lu, id
d8c0: 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75  entity_num = %lu
d8d0: 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
d8e0: 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73  ong) objectclass
d8f0: 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b  , identity_num);
d900: 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
d910: 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
d920: 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63  ICATE && objectc
d930: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c  lass != CKO_PUBL
d940: 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74  IC_KEY && object
d950: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49  class != CKO_PRI
d960: 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 43 41  VATE_KEY) {...CA
d970: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d980: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
d990: 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69  bjects (NULL), i
d9a0: 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c  nvalid object cl
d9b0: 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ass");....return
d9c0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
d9d0: 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20  Get Cert */..if 
d9e0: 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  (identity == NUL
d9f0: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
da00: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
da10: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
da20: 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
da30: 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64  identiy provided
da40: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
da50: 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66  LL);..}...certif
da60: 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79  icate = identity
da70: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  ->certificate;..
da80: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
da90: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
daa0: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69  ificate_len;...i
dab0: 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
dac0: 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74  en == -1 || cert
dad0: 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29  ificate == NULL)
dae0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
daf0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
db00: 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
db10: 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74  ULL), this ident
db20: 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ity does not hav
db30: 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69  e an X.509 certi
db40: 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
db50: 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69  d with it and wi
db60: 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a  ll not work");..
db70: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
db80: 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
db90: 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20  hat certificate 
dba0: 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64  is ASN.1 encoded
dbb0: 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
dbc0: 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f  te */..if (x509_
dbd0: 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
dbe0: 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
dbf0: 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20  te_len, NULL) < 
dc00: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
dc10: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
dc20: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
dc30: 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30  (NULL), the X.50
dc40: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73  9 certificate as
dc50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
dc60: 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e  is identity is n
dc70: 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72  ot valid");....r
dc80: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
dc90: 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d  ..retval_count =
dca0: 20 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d   16;..retval = m
dcb0: 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75  alloc(retval_cou
dcc0: 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
dcd0: 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75  val));...for (cu
dce0: 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30  rr_attr_type = 0
dcf0: 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ; curr_attr_type
dd00: 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b 20 63   < 0xce53635f; c
dd10: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29  urr_attr_type++)
dd20: 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74   {...if (curr_at
dd30: 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30  tr_type == 0x800
dd40: 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72  ) {....curr_attr
dd50: 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33  _type = 0xce5363
dd60: 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75  00;...}....pValu
dd70: 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56  e_free = 0;...pV
dd80: 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75  alue = NULL;...u
dd90: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
dda0: 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69  LONG) -1;....swi
ddb0: 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74  tch (curr_attr_t
ddc0: 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
ddd0: 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41  KA_CLASS:.....CA
dde0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ddf0: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
de00: 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53  tribute CKA_CLAS
de10: 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  S (0x%08lx) ..."
de20: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
de30: 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
de40: 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63  );......ck_objec
de50: 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74  t_class = object
de60: 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c  class;......pVal
de70: 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f  ue = &ck_object_
de80: 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c  class;.....ulVal
de90: 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
dea0: 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b  k_object_class);
deb0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
dec0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
ded0: 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
dee0: 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
def0: 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f  ed long) *((CK_O
df00: 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70  BJECT_CLASS *) p
df10: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
df20: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
df30: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
df40: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
df50: 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09   CKA_TOKEN:.....
df60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
df70: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
df80: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f  attribute CKA_TO
df90: 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  KEN (0x%08lx) ..
dfa0: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
dfb0: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
dfc0: 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
dfd0: 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
dfe0: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
dff0: 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
e000: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
e010: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
e020: 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
e030: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
e040: 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
e050: 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
e060: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
e070: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
e080: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
e090: 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
e0a0: 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b  FIABLE:.....CACK
e0b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e0c0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
e0d0: 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49  ibute CKA_MODIFI
e0e0: 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
e0f0: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
e100: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
e110: 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
e120: 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
e130: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
e140: 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
e150: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
e160: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
e170: 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
e180: 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
e190: 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
e1a0: 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
e1b0: 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
e1c0: 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
e1d0: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
e1e0: 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c  k;....case CKA_L
e1f0: 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABEL:.....CACKEY
e200: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
e210: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
e220: 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30  ute CKA_LABEL (0
e230: 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
e240: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
e250: 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
e260: 09 09 09 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..../* Determine
e270: 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 78 35 30   name */.....x50
e280: 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  9_read_ret = cac
e290: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
e2a0: 79 5f 74 6f 5f 6c 61 62 65 6c 28 69 64 65 6e 74  y_to_label(ident
e2b0: 69 74 79 2c 20 75 63 54 6d 70 42 75 66 2c 20 73  ity, ucTmpBuf, s
e2c0: 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29  izeof(ucTmpBuf))
e2d0: 3b 0a 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ;.....if (x509_r
e2e0: 65 61 64 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09  ead_ret > 0) {..
e2f0: 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54  ....pValue = ucT
e300: 6d 70 42 75 66 3b 0a 09 09 09 09 09 75 6c 56 61  mpBuf;......ulVa
e310: 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
e320: 61 64 5f 72 65 74 3b 0a 09 09 09 09 7d 0a 0a 09  ad_ret;.....}...
e330: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e340: 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
e350: 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
e360: 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
e370: 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
e380: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
e390: 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56  k;....case CKA_V
e3a0: 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ALUE:.....CACKEY
e3b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
e3c0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
e3d0: 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30  ute CKA_VALUE (0
e3e0: 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
e3f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
e400: 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
e410: 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65  ....switch (obje
e420: 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09  ctclass) {......
e430: 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45  case CKO_PRIVATE
e440: 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b  _KEY:.......CACK
e450: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e460: 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
e470: 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
e480: 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74   we are a privat
e490: 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09  e key.");.......
e4a0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
e4b0: 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  e CKO_PUBLIC_KEY
e4c0: 3a 0a 09 09 09 09 09 09 2f 2a 20 58 58 58 3a 20  :......./* XXX: 
e4d0: 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09 09 09 09 62  TODO */........b
e4e0: 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
e4f0: 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a  CKO_CERTIFICATE:
e500: 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
e510: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
e520: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
e530: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
e540: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
e550: 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
e560: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
e570: 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
e580: 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
e590: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
e5a0: 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
e5b0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
e5c0: 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09  CKA_ISSUER:.....
e5d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e5e0: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
e5f0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53  attribute CKA_IS
e600: 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  SUER (0x%08lx) .
e610: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
e620: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
e630: 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
e640: 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
e650: 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
e660: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
e670: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
e680: 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
e690: 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
e6a0: 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
e6b0: 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  ate.");.......br
e6c0: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
e6d0: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
e6e0: 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
e6f0: 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
e700: 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28   x509_to_issuer(
e710: 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
e720: 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
e730: 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
e740: 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
e750: 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
e760: 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
e770: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
e780: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
e790: 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
e7a0: 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
e7b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e7c0: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
e7d0: 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
e7e0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e7f0: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
e800: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
e810: 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  se CKA_SERIAL_NU
e820: 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59  MBER:.....CACKEY
e830: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
e840: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
e850: 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e  ute CKA_SERIAL_N
e860: 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78 29 20  UMBER (0x%08lx) 
e870: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
e880: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
e890: 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
e8a0: 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
e8b0: 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
e8c0: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
e8d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
e8e0: 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
e8f0: 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
e900: 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
e910: 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62  cate.");.......b
e920: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
e930: 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
e940: 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
e950: 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
e960: 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c  = x509_to_serial
e970: 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
e980: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
e990: 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
e9a0: 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
e9b0: 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
e9c0: 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
e9d0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
e9e0: 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
e9f0: 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
ea00: 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
ea10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ea20: 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
ea30: 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61  g (%p/%lu)", pVa
ea40: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
ea50: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
ea60: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
ea70: 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43  .case CKA_SUBJEC
ea80: 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  T:.....CACKEY_DE
ea90: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
eaa0: 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
eab0: 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78   CKA_SUBJECT (0x
eac0: 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
ead0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
eae0: 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
eaf0: 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
eb00: 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
eb10: 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
eb20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
eb30: 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
eb40: 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
eb50: 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
eb60: 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a  certificate.");.
eb70: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
eb80: 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
eb90: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
eba0: 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
ebb0: 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
ebc0: 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69  _subject(certifi
ebd0: 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
ebe0: 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
ebf0: 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
ec00: 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
ec10: 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
ec20: 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
ec30: 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
ec40: 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
ec50: 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
ec60: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
ec70: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
ec80: 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
ec90: 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
eca0: 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
ecb0: 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
ecc0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
ecd0: 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ID:.....CACKEY_D
ece0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
ecf0: 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
ed00: 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c  e CKA_ID (0x%08l
ed10: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
ed20: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
ed30: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 75  tr_type);......u
ed40: 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69  cTmpBuf[0] = ((i
ed50: 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29  dentity_num + 1)
ed60: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09   >> 8) & 0xff;..
ed70: 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d  ...ucTmpBuf[1] =
ed80: 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20    (identity_num 
ed90: 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09  + 1) & 0xff;....
eda0: 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d  ..pValue = &ucTm
edb0: 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75  pBuf;.....ulValu
edc0: 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43  eLen = 2;......C
edd0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ede0: 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
edf0: 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
ee00: 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
ee10: 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
ee20: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
ee30: 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49  case CKA_CERTIFI
ee40: 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43  CATE_TYPE:.....C
ee50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ee60: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
ee70: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
ee80: 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 28 30  TIFICATE_TYPE (0
ee90: 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
eea0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
eeb0: 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
eec0: 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
eed0: 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
eee0: 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
eef0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ef00: 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
ef10: 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
ef20: 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
ef30: 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b   certificate.");
ef40: 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
ef50: 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f  ..}....../* We o
ef60: 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20  nly support one 
ef70: 63 65 72 74 69 66 69 63 61 74 65 20 74 79 70 65  certificate type
ef80: 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69   */.....ck_certi
ef90: 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b  ficate_type = CK
efa0: 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56  C_X_509;......pV
efb0: 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69  alue = &ck_certi
efc0: 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09  ficate_type;....
efd0: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
efe0: 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63  zeof(ck_certific
eff0: 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ate_type);......
f000: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f010: 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
f020: 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25  ing CKC_X_509 (%
f030: 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  lu) (%p/%lu)", (
f040: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
f050: 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ((CK_CERTIFICATE
f060: 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29  _TYPE *) pValue)
f070: 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
f080: 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
f090: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
f0a0: 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b  k;....case CKA_K
f0b0: 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43  EY_TYPE:.....CAC
f0c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f0d0: 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
f0e0: 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54  ribute CKA_KEY_T
f0f0: 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPE (0x%08lx) ..
f100: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
f110: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
f120: 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
f130: 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
f140: 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20  _PRIVATE_KEY && 
f150: 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
f160: 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b  KO_PUBLIC_KEY) {
f170: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
f180: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
f190: 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
f1a0: 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
f1b0: 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a  e not a key.");.
f1c0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
f1d0: 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e  .}....../* We on
f1e0: 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b  ly support one k
f1f0: 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63  ey type */.....c
f200: 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b  k_key_type = CKK
f210: 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75  _RSA;......pValu
f220: 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65  e = &ck_key_type
f230: 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
f240: 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79   = sizeof(ck_key
f250: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43  _type);......CAC
f260: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f270: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
f280: 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28   CKK_RSA (%lu) (
f290: 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
f2a0: 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
f2b0: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
f2c0: 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
f2d0: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
f2e0: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
f2f0: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
f300: 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a  .case CKA_SIGN:.
f310: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f320: 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
f330: 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
f340: 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29  A_SIGN (0x%08lx)
f350: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
f360: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
f370: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
f380: 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
f390: 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29  CKO_PRIVATE_KEY)
f3a0: 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
f3b0: 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
f3c0: 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
f3d0: 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09  eof(ck_true);...
f3e0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
f3f0: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
f400: 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
f410: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
f420: 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
f430: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f440: 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
f450: 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
f460: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
f470: 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
f480: 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
f490: 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
f4a0: 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
f4b0: 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
f4c0: 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59  ..case CKA_DECRY
f4d0: 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PT:.....CACKEY_D
f4e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
f4f0: 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
f500: 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30  e CKA_DECRYPT (0
f510: 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
f520: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
f530: 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
f540: 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
f550: 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
f560: 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74  TE_KEY || object
f570: 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42  class == CKO_PUB
f580: 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  LIC_KEY) {......
f590: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
f5a0: 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
f5b0: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
f5c0: 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
f5d0: 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
f5e0: 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
f5f0: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
f600: 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
f610: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
f620: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f630: 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
f640: 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
f650: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
f660: 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
f670: 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
f680: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
f690: 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
f6a0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
f6b0: 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f  KA_TRUST_SERVER_
f6c0: 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b 45 59  AUTH:.....CACKEY
f6d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
f6e0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
f6f0: 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45  ute CKA_TRUST_SE
f700: 52 56 45 52 5f 41 55 54 48 20 28 30 78 25 30 38  RVER_AUTH (0x%08
f710: 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
f720: 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
f730: 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
f740: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
f750: 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
f760: 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
f770: 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ue);......CACKEY
f780: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
f790: 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
f7a0: 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
f7b0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
f7c0: 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
f7d0: 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
f7e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
f7f0: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
f800: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
f810: 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41  A_TRUST_CLIENT_A
f820: 55 54 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  UTH:.....CACKEY_
f830: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f840: 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
f850: 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49  te CKA_TRUST_CLI
f860: 45 4e 54 5f 41 55 54 48 20 28 30 78 25 30 38 6c  ENT_AUTH (0x%08l
f870: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
f880: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
f890: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
f8a0: 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
f8b0: 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
f8c0: 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
f8d0: 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
f8e0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
f8f0: 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
f900: 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
f910: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
f920: 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
f930: 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
f940: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
f950: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
f960: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
f970: 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
f980: 49 4e 47 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ING:.....CACKEY_
f990: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f9a0: 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
f9b0: 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44  te CKA_TRUST_COD
f9c0: 45 5f 53 49 47 4e 49 4e 47 20 28 30 78 25 30 38  E_SIGNING (0x%08
f9d0: 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
f9e0: 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
f9f0: 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
fa00: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
fa10: 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
fa20: 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
fa30: 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ue);......CACKEY
fa40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
fa50: 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
fa60: 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
fa70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
fa80: 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
fa90: 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
faa0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
fab0: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
fac0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
fad0: 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52  A_TRUST_EMAIL_PR
fae0: 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41  OTECTION:.....CA
faf0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fb00: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
fb10: 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
fb20: 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49  T_EMAIL_PROTECTI
fb30: 4f 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ON (0x%08lx) ...
fb40: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
fb50: 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
fb60: 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
fb70: 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
fb80: 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
fb90: 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
fba0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fbb0: 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
fbc0: 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
fbd0: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
fbe0: 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
fbf0: 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
fc00: 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
fc10: 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
fc20: 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
fc30: 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 70  ..default:.....p
fc40: 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
fc50: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
fc60: 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09  CK_LONG) -1;....
fc70: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69  .break;...}....i
fc80: 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c  f (((CK_LONG) ul
fc90: 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28 43  ValueLen) != ((C
fca0: 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09  K_LONG) -1)) {..
fcb0: 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72 5f 61  ../* Push curr_a
fcc0: 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ttr onto the sta
fcd0: 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74  ck */....curr_at
fce0: 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72 5f 61  tr.type = curr_a
fcf0: 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63 75 72  ttr_type;....cur
fd00: 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65  r_attr.ulValueLe
fd10: 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  n = ulValueLen;.
fd20: 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 70 56  ....curr_attr.pV
fd30: 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  alue = malloc(cu
fd40: 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c  rr_attr.ulValueL
fd50: 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63  en);....memcpy(c
fd60: 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c  urr_attr.pValue,
fd70: 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74   pValue, curr_at
fd80: 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  tr.ulValueLen);.
fd90: 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65 5f 66  ....if (pValue_f
fda0: 72 65 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b  ree && pValue) {
fdb0: 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c 75 65  .....free(pValue
fdc0: 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
fdd0: 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65 74 76  numattrs >= retv
fde0: 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  al_count) {.....
fdf0: 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 3d 20  retval_count *= 
fe00: 32 3b 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  2;.....retval = 
fe10: 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20  realloc(retval, 
fe20: 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
fe30: 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
fe40: 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79  ....}.....memcpy
fe50: 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72  (&retval[numattr
fe60: 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20  s], &curr_attr, 
fe70: 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72  sizeof(curr_attr
fe80: 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b  ));....numattrs+
fe90: 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  +;...}..}...if (
fea0: 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b  numattrs != 0) {
feb0: 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
fec0: 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65  = numattrs;...re
fed0: 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72  tval = realloc(r
fee0: 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f  etval, retval_co
fef0: 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
ff00: 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20  tval));..} else 
ff10: 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61 6c 29  {...free(retval)
ff20: 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55  ;....retval = NU
ff30: 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75  LL;..}...*pulCou
ff40: 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a  nt = numattrs;..
ff50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ff60: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
ff70: 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29  %lu objects (%p)
ff80: 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20 72 65  .", numattrs, re
ff90: 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
ffa0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
ffb0: 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
ffc0: 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69  K_RV, C_Initiali
ffd0: 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ze)(CK_VOID_PTR 
ffe0: 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b  pInitArgs) {..CK
fff0: 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52  _C_INITIALIZE_AR
10000 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a  GS CK_PTR args;.
10010 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09  .uint32_t idx;..
10020 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72  int mutex_init_r
10030 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
10040 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
10050 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 69  d.");...if (pIni
10060 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  tArgs != NULL) {
10070 0a 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41  ...args = pInitA
10080 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63  rgs;...memcpy(&c
10090 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73  ackey_args, args
100a0 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  , sizeof(cackey_
100b0 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61  args));....if (a
100c0 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78  rgs->CreateMutex
100d0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
100e0 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d  ->DestroyMutex =
100f0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
10100 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  LockMutex == NUL
10110 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63  L || args->Unloc
10120 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20  kMutex == NULL) 
10130 7b 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43  {....if (args->C
10140 72 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55  reateMutex != NU
10150 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74  LL || args->Dest
10160 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  royMutex != NULL
10170 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75   || args->LockMu
10180 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
10190 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78  rgs->UnlockMutex
101a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
101b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
101c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65  NTF("Error. Some
101d0 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68  , but not All th
101e0 72 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76  reading primitiv
101f0 65 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a  es provided.");.
10200 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
10210 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
10220 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
10230 61 72 67 73 2d 3e 70 52 65 73 65 72 76 65 64 20  args->pReserved 
10240 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41  != NULL) {....CA
10250 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10260 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72  F("Error. pReser
10270 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ved is not NULL.
10280 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
10290 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
102a0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
102b0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  ...cackey_args.C
102c0 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c  reateMutex = NUL
102d0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
102e0 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20  .DestroyMutex = 
102f0 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
10300 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20  rgs.LockMutex = 
10310 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
10320 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  rgs.UnlockMutex 
10330 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
10340 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b  _args.flags = 0;
10350 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
10360 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
10370 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10380 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41  RINTF("Error.  A
10390 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a  lready initializ
103a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
103b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c  (CKR_CRYPTOKI_AL
103c0 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45  READY_INITIALIZE
103d0 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  D);..}...for (id
103e0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
103f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
10400 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
10410 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
10420 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
10430 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
10440 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b  idx].active = 0;
10450 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
10460 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
10470 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
10480 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
10490 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b  slots[0])); idx+
104a0 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  +) {...cackey_sl
104b0 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20  ots[idx].active 
104c0 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
104d0 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65  ots[idx].pcsc_re
104e0 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  ader = NULL;...c
104f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
10500 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  .transaction_dep
10510 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  th = 0;...cackey
10520 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74  _slots[idx].slot
10530 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a  _reset = 0;..}..
10540 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  .cackey_initiali
10550 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21  zed = 1;...if (!
10560 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69  cackey_biglock_i
10570 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69  nit) {...mutex_i
10580 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  nit_ret = cackey
10590 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26 63  _mutex_create(&c
105a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
105b0 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69  ...if (mutex_ini
105c0 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
105d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
105e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 75  INTF("Error.  Mu
105f0 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tex initializati
10600 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  on failed.");...
10610 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e  ..return(CKR_CAN
10620 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09  T_LOCK);...}....
10630 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69  cackey_biglock_i
10640 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41  nit = 1;..}...CA
10650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10660 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
10670 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
10680 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
10690 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
106a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
106b0 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29 28 43  V, C_Finalize)(C
106c0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65  K_VOID_PTR pRese
106d0 72 76 65 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f  rved) {..uint32_
106e0 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
106f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
10700 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
10710 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c  Reserved != NULL
10720 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
10730 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
10740 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e  . pReserved is n
10750 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
10760 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
10770 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
10780 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
10790 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
107a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
107b0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
107c0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
107d0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
107e0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
107f0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  ZED);..}...for (
10800 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
10810 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
10820 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
10830 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
10840 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
10850 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
10860 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
10870 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73 65 53  e) {....C_CloseS
10880 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 7d  ession(idx);...}
10890 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f  ..}...cackey_slo
108a0 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
108b0 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20  l();...for (idx 
108c0 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
108d0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
108e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
108f0 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78  _slots[0])); idx
10900 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
10910 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
10920 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09  sc_reader) {....
10930 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
10940 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
10950 65 72 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61  er);...}..}...ca
10960 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
10970 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65 79  nect();...cackey
10980 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30  _initialized = 0
10990 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
109a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
109b0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
109c0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
109d0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
109e0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
109f0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e  N(CK_RV, C_GetIn
10a00 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20  fo)(CK_INFO_PTR 
10a10 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63  pInfo) {..static
10a20 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e   CK_UTF8CHAR man
10a30 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20  ufacturerID[] = 
10a40 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74  "U.S. Government
10a50 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
10a60 46 38 43 48 41 52 20 6c 69 62 72 61 72 79 44 65  F8CHAR libraryDe
10a70 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43  scription[] = "C
10a80 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59  ACKey";...CACKEY
10a90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
10aa0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
10ab0 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pInfo == NULL) {
10ac0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10ad0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
10ae0 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  Info is NULL.");
10af0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
10b00 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
10b10 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
10b20 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
10b30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10b40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
10b50 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
10b60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
10b70 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
10b80 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
10b90 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56  pInfo->cryptokiV
10ba0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
10bb0 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
10bc0 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
10bd0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
10be0 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65  Info->cryptokiVe
10bf0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28  rsion.minor = ((
10c00 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
10c10 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
10c20 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65   8) & 0xff;...me
10c30 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
10c40 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
10c50 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
10c60 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
10c70 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
10c80 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
10c90 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
10ca0 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75  sizeof(manufactu
10cb0 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70  rerID) - 1);...p
10cc0 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78  Info->flags = 0x
10cd0 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  00;...memset(pIn
10ce0 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72  fo->libraryDescr
10cf0 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a  iption, ' ', siz
10d00 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  eof(pInfo->libra
10d10 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b  ryDescription));
10d20 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
10d30 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
10d40 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63 72  on, libraryDescr
10d50 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c  iption, sizeof(l
10d60 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
10d70 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f  n) - 1);...pInfo
10d80 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e  ->libraryVersion
10d90 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79  .major = (cackey
10da0 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
10db0 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49   16) & 0xff;..pI
10dc0 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73  nfo->libraryVers
10dd0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
10de0 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
10df0 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
10e00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10e10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
10e20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
10e30 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
10e40 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  CKR_OK);.}../*. 
10e50 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20 6f  * Process list o
10e60 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20 63  f readers, and c
10e70 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62 65  reate mapping be
10e80 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61 6d  tween reader nam
10e90 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a  e and slot ID. *
10ea0 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
10eb0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
10ec0 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42  tSlotList)(CK_BB
10ed0 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74  OOL tokenPresent
10ee0 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52  , CK_SLOT_ID_PTR
10ef0 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55   pSlotList, CK_U
10f00 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e  LONG_PTR pulCoun
10f10 74 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  t) {..int mutex_
10f20 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73  retval;..int pcs
10f30 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
10f40 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20  CK_ULONG count, 
10f50 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20  slot_count = 0, 
10f60 63 75 72 72 73 6c 6f 74 3b 0a 09 63 68 61 72 20  currslot;..char 
10f70 2a 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 2a  *pcsc_readers, *
10f80 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 2c 20  pcsc_readers_s, 
10f90 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 3b  *pcsc_readers_e;
10fa0 0a 09 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61  ..DWORD pcsc_rea
10fb0 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20  ders_len;..LONG 
10fc0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
10fd0 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63  s_ret;..size_t c
10fe0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a  urr_reader_len;.
10ff0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11000 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
11010 3b 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74  ;...if (pulCount
11020 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
11030 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11040 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f 75  F("Error. pulCou
11050 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
11060 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
11070 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
11080 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
11090 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
110a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
110b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
110c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
110d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
110e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
110f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75  ALIZED);..}...mu
11100 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
11110 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
11120 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
11130 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
11140 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
11150 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11160 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
11170 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
11180 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
11190 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f  L_ERROR);..}.../
111a0 2a 20 43 6c 65 61 72 20 6c 69 73 74 20 6f 66 20  * Clear list of 
111b0 73 6c 6f 74 73 20 2a 2f 0a 09 69 66 20 28 70 53  slots */..if (pS
111c0 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 2f 2a 20  lotList) {.../* 
111d0 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  Only update the 
111e0 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66  list of slots if
111f0 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79   we are actually
11200 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68   being supply th
11210 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  e slot informati
11220 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73  on */...cackey_s
11230 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
11240 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63  all();....for (c
11250 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
11260 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
11270 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
11280 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
11290 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
112a0 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63  ot++) {....if (c
112b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
112c0 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
112d0 72 29 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61  r) {.....free(ca
112e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
112f0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
11300 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  );......cackey_s
11310 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70  lots[currslot].p
11320 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c  csc_reader = NUL
11330 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  L;....}.....cack
11340 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
11350 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  t].active = 0;..
11360 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  .}..}.../* Deter
11370 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61  mine list of rea
11380 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f  ders */..pcsc_co
11390 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
113a0 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
113b0 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
113c0 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
113d0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
113e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
113f0 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
11400 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
11410 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73  d, assuming no s
11420 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f  lots");....slot_
11430 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c  count = 0;..} el
11440 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64  se {...pcsc_read
11450 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09  ers_len = 0;....
11460 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
11470 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
11480 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
11490 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
114a0 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
114b0 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
114c0 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
114d0 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
114e0 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20  RD_S_SUCCESS && 
114f0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
11500 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63   != 0) {....pcsc
11510 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f  _readers = mallo
11520 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  c(pcsc_readers_l
11530 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61  en);....pcsc_rea
11540 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65  ders_s = pcsc_re
11550 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64  aders;.....scard
11560 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
11570 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
11580 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
11590 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70  _handle, NULL, p
115a0 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63  csc_readers, &pc
115b0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
115c0 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
115d0 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
115e0 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
115f0 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61  ) {.....pcsc_rea
11600 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65  ders_e = pcsc_re
11610 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61  aders + pcsc_rea
11620 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 63  ders_len;......c
11630 75 72 72 73 6c 6f 74 20 3d 20 30 3b 0a 09 09 09  urrslot = 0;....
11640 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61  .while (pcsc_rea
11650 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64  ders < pcsc_read
11660 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 63 75  ers_e) {......cu
11670 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20  rr_reader_len = 
11680 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64  strlen(pcsc_read
11690 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28  ers);.......if (
116a0 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20  (pcsc_readers + 
116b0 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29  curr_reader_len)
116c0 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   > pcsc_readers_
116d0 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  e) {.......break
116e0 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
116f0 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  f (curr_reader_l
11700 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09  en == 0) {......
11710 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
11720 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
11730 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  t >= (sizeof(cac
11740 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
11750 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
11760 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43  [0]))) {.......C
11770 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11780 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72  TF("Found more r
11790 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74  eaders than slot
117a0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21  s are available!
117b0 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
117c0 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43  ;......}.......C
117d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
117e0 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72  TF("Found reader
117f0 3a 20 25 73 22 2c 20 70 63 73 63 5f 72 65 61 64  : %s", pcsc_read
11800 65 72 73 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f  ers);......./* O
11810 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c  nly update the l
11820 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20  ist of slots if 
11830 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  we are actually 
11840 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65  being supply the
11850 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f   slot informatio
11860 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53  n */......if (pS
11870 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09  lotList) {......
11880 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
11890 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d  rrslot].active =
118a0 20 31 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79   1;.......cackey
118b0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
118c0 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73  .pcsc_reader = s
118d0 74 72 64 75 70 28 70 63 73 63 5f 72 65 61 64 65  trdup(pcsc_reade
118e0 72 73 29 3b 0a 09 09 09 09 09 09 63 61 63 6b 65  rs);.......cacke
118f0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
11900 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
11910 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09  ected = 0;......
11920 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
11930 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74  rrslot].transact
11940 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09  ion_depth = 0;..
11950 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
11960 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74  s[currslot].slot
11970 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09  _reset = 1;.....
11980 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f 74  .}......currslot
11990 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f 72  ++;.......pcsc_r
119a0 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72  eaders += curr_r
119b0 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09  eader_len + 1;..
119c0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 75  ...}......if (cu
119d0 72 72 73 6c 6f 74 20 3e 20 30 29 20 7b 0a 09 09  rrslot > 0) {...
119e0 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  ...slot_count = 
119f0 63 75 72 72 73 6c 6f 74 3b 0a 09 09 09 09 7d 0a  currslot;.....}.
11a00 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
11a10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11a20 4e 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c  NTF("Second call
11a30 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61   to SCardListRea
11a40 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74  ders failed, ret
11a50 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43  urn %s/%li", CAC
11a60 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
11a70 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
11a80 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
11a90 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
11aa0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
11ab0 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66  ret);....}.....f
11ac0 72 65 65 28 70 63 73 63 5f 72 65 61 64 65 72 73  ree(pcsc_readers
11ad0 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  _s);...} else {.
11ae0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11af0 50 52 49 4e 54 46 28 22 46 69 72 73 74 20 63 61  PRINTF("First ca
11b00 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52  ll to SCardListR
11b10 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72  eaders failed, r
11b20 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43  eturn %s/%li", C
11b30 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
11b40 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
11b50 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
11b60 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  rs_ret), (long) 
11b70 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
11b80 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  s_ret);...}..}..
11b90 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
11ba0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
11bb0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
11bc0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
11bd0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
11be0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11bf0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
11c00 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
11c10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
11c20 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
11c30 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c  ..}...if (pSlotL
11c40 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
11c50 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f  .*pulCount = slo
11c60 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b  t_count;....CACK
11c70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11c80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
11c90 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
11ca0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
11cb0 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20  OK);..}...count 
11cc0 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66  = *pulCount;..if
11cd0 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63   (count < slot_c
11ce0 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  ount) {...CACKEY
11cf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11d00 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63  rror. User alloc
11d10 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65 73  ated %lu entries
11d20 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 25 6c  , but we have %l
11d30 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75  u entries.", cou
11d40 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b  nt, slot_count);
11d50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42  ....return(CKR_B
11d60 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
11d70 3b 09 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72  ;...}...for (cur
11d80 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73  rslot = 0; currs
11d90 6c 6f 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74  lot < slot_count
11da0 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
11db0 09 09 70 53 6c 6f 74 4c 69 73 74 5b 63 75 72 72  ..pSlotList[curr
11dc0 73 6c 6f 74 5d 20 3d 20 63 75 72 72 73 6c 6f 74  slot] = currslot
11dd0 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  ;..}...*pulCount
11de0 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a   = slot_count;..
11df0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11e00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
11e10 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f  CKR_OK (%i).  Fo
11e20 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e  und %lu readers.
11e30 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
11e40 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
11e50 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  count);...return
11e60 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65  (CKR_OK);...toke
11e70 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e  nPresent = token
11e80 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72  Present; /* Supr
11e90 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
11ea0 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
11eb0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
11ec0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
11ed0 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c  tSlotInfo)(CK_SL
11ee0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
11ef0 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70  _SLOT_INFO_PTR p
11f00 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
11f10 43 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74  CK_UTF8CHAR slot
11f20 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
11f30 22 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09  "CACKey Slot";..
11f40 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
11f50 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f  ;..int bytes_to_
11f60 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  copy;...CACKEY_D
11f70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
11f80 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
11f90 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
11fa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11fb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
11fc0 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
11fd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
11fe0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
11ff0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
12000 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
12010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12020 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
12030 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
12040 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
12050 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
12060 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
12070 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
12080 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
12090 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
120a0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
120b0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
120c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
120d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
120e0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
120f0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
12100 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
12110 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
12120 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
12130 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
12140 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
12150 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
12160 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
12170 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
12180 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
12190 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
121a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
121b0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
121c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
121d0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
121e0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
121f0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
12200 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
12210 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12220 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
12230 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
12240 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
12250 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
12260 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
12270 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
12280 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
12290 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
122a0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
122b0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
122c0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
122d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
122e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
122f0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
12300 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
12310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
12320 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
12330 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
12340 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
12350 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d  ERROR);..}...mem
12360 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  set(pInfo->slotD
12370 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c  escription, ' ',
12380 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73   sizeof(pInfo->s
12390 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29  lotDescription))
123a0 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
123b0 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e  >slotDescription
123c0 2c 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  , slotDescriptio
123d0 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65  n, sizeof(slotDe
123e0 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b  scription) - 1);
123f0 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
12400 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
12410 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
12420 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
12430 49 44 29 29 3b 0a 0a 09 62 79 74 65 73 5f 74 6f  ID));...bytes_to
12440 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 63  _copy = strlen(c
12450 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
12460 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ID].pcsc_reader)
12470 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70 49  ;..if (sizeof(pI
12480 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
12490 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f 5f  rID) < bytes_to_
124a0 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73 5f  copy) {...bytes_
124b0 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f 66  to_copy = sizeof
124c0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
124d0 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d  urerID);..}..mem
124e0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
124f0 61 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b 65  acturerID, cacke
12500 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
12510 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79 74  pcsc_reader, byt
12520 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 70  es_to_copy);...p
12530 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  Info->flags = 0;
12540 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
12550 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
12560 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
12570 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) == CACKEY_PCS
12580 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
12590 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
125a0 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f  gs |= CKF_TOKEN_
125b0 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 70 49  PRESENT;..}...pI
125c0 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72  nfo->hardwareVer
125d0 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61  sion.major = (ca
125e0 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
125f0 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
12600 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
12610 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
12620 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
12630 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78  ion() >> 8) & 0x
12640 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  ff;...pInfo->fir
12650 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  mwareVersion.maj
12660 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66  or = 0x00;..pInf
12670 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
12680 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b  on.minor = 0x00;
12690 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
126a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
126b0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
126c0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
126d0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
126e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
126f0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b  (CK_RV, C_GetTok
12700 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  enInfo)(CK_SLOT_
12710 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f  ID slotID, CK_TO
12720 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  KEN_INFO_PTR pIn
12730 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
12740 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61  _UTF8CHAR manufa
12750 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e  cturerID[] = "U.
12760 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a  S. Government";.
12770 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
12780 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62 65 6c  HAR defaultLabel
12790 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f  [] = "Unknown To
127a0 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20 43 4b  ken";..static CK
127b0 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b  _UTF8CHAR model[
127c0 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b  ] = "CAC Token";
127d0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
127e0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
127f0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
12800 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
12810 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a 65  um_certs;..ssize
12820 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69  _t label_ret;..i
12830 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
12840 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61 75 6c  ..int use_defaul
12850 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45  t_label;...CACKE
12860 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12870 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
12880 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
12890 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
128a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
128b0 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
128c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
128d0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
128e0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
128f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
12900 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12910 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
12920 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
12930 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
12940 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
12950 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
12960 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
12970 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
12980 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
12990 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
129a0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
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 49  PRINTF("Error. I
129d0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
129e0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
129f0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
12a00 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
12a10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
12a20 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
12a30 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
12a40 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
12a50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
12a60 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
12a70 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
12a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12a90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
12aa0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
12ab0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
12ac0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
12ad0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
12ae0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
12af0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
12b00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12b10 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
12b20 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
12b30 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
12b40 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
12b50 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
12b60 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
12b70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
12b80 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
12b90 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
12ba0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
12bb0 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
12bc0 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ent(&cackey_slot
12bd0 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41  s[slotID]) != CA
12be0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
12bf0 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41  NPRESENT) {...CA
12c00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12c10 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70  F("No token is p
12c20 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44  resent in slotID
12c30 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29   = %lu", slotID)
12c40 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
12c50 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
12c60 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
12c70 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f  urn(CKR_TOKEN_NO
12c80 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a  T_PRESENT);..}..
12c90 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
12ca0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
12cb0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
12cc0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
12cd0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
12ce0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12cf0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
12d00 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
12d10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
12d20 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
12d30 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
12d40 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66  ne token label f
12d50 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74 65 73  rom certificates
12d60 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66   */..memset(pInf
12d70 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73  o->label, ' ', s
12d80 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
12d90 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75  el));..use_defau
12da0 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09  lt_label = 1;...
12db0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
12dc0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
12dd0 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  rts(&cackey_slot
12de0 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c  s[slotID], NULL,
12df0 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69   &num_certs);..i
12e00 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  f (pcsc_identiti
12e10 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
12e20 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
12e30 30 29 20 7b 0a 09 09 09 6c 61 62 65 6c 5f 72 65  0) {....label_re
12e40 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
12e50 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65  identity_to_labe
12e60 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  l(pcsc_identitie
12e70 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  s, pInfo->label,
12e80 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
12e90 61 62 65 6c 29 29 3b 0a 09 09 09 69 66 20 28 6c  abel));....if (l
12ea0 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a  abel_ret > 0) {.
12eb0 09 09 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  ....use_default_
12ec0 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 09 09 7d 0a  label = 0;....}.
12ed0 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
12ee0 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
12ef0 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
12f00 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 69 66  rts, 1);..}...if
12f10 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61   (use_default_la
12f20 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  bel) {...memcpy(
12f30 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65  pInfo->label, de
12f40 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65  faultLabel, size
12f50 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29  of(defaultLabel)
12f60 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73   - 1);..}...mems
12f70 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
12f80 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
12f90 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
12fa0 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09  ufacturerID));..
12fb0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
12fc0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61  nufacturerID, ma
12fd0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69  nufacturerID, si
12fe0 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65  zeof(manufacture
12ff0 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  rID) - 1);...mem
13000 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  set(pInfo->model
13010 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
13020 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d  nfo->model));..m
13030 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emcpy(pInfo->mod
13040 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f  el, model, sizeo
13050 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a  f(model) - 1);..
13060 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73  .memset(pInfo->s
13070 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27  erialNumber, ' '
13080 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
13090 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a  serialNumber));.
130a0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
130b0 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69  utcTime, ' ', si
130c0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54  zeof(pInfo->utcT
130d0 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  ime));...pInfo->
130e0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
130f0 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
13100 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
13110 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
13120 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
13130 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
13140 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
13150 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
13160 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
13170 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
13180 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
13190 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
131a0 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49  nor = 0x00;...pI
131b0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
131c0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
131d0 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   | CKF_USER_PIN_
131e0 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b  INITIALIZED | CK
131f0 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49  F_TOKEN_INITIALI
13200 5a 45 44 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ZED | CKF_LOGIN_
13210 52 45 51 55 49 52 45 44 3b 0a 0a 09 70 49 6e 66  REQUIRED;...pInf
13220 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43  o->ulMaxSessionC
13230 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63  ount = (sizeof(c
13240 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
13250 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
13260 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20  sessions[0])) - 
13270 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73  1;..pInfo->ulSes
13280 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55  sionCount = CK_U
13290 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
132a0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
132b0 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f  ulMaxRwSessionCo
132c0 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  unt = 0;..pInfo-
132d0 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  >ulRwSessionCoun
132e0 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  t = CK_UNAVAILAB
132f0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
13300 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e  .pInfo->ulMaxPin
13310 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66  Len = 128;..pInf
13320 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d  o->ulMinPinLen =
13330 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f   0;..pInfo->ulTo
13340 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  talPublicMemory 
13350 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
13360 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
13370 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c  Info->ulFreePubl
13380 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  icMemory = CK_UN
13390 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
133a0 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
133b0 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d  lTotalPrivateMem
133c0 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
133d0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
133e0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65  ;..pInfo->ulFree
133f0 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
13400 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
13410 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41  NFORMATION;...CA
13420 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13430 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
13440 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
13450 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
13460 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
13470 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
13480 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74  V, C_WaitForSlot
13490 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20  Event)(CK_FLAGS 
134a0 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49  flags, CK_SLOT_I
134b0 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43  D_PTR pSlotID, C
134c0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65  K_VOID_PTR pRese
134d0 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f  rved) {..CACKEY_
134e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
134f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
13500 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c  Reserved != NULL
13510 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
13520 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
13530 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e  . pReserved is n
13540 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
13550 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
13560 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
13570 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
13580 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
13590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
135a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
135b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
135c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
135d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
135e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
135f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13600 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
13610 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
13620 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
13630 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
13640 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
13650 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
13660 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
13670 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
13680 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
13690 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28  tMechanismList)(
136a0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
136b0 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  D, CK_MECHANISM_
136c0 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e  TYPE_PTR pMechan
136d0 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  ismList, CK_ULON
136e0 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
136f0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
13700 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
13710 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
13720 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
13730 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13740 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
13750 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
13760 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
13770 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
13780 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
13790 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d  .if (pulCount ==
137a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
137b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
137c0 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74  Error.  pulCount
137d0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
137e0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
137f0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
13800 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69  if (pMechanismLi
13810 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
13820 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 33 3b 0a 0a  *pulCount = 3;..
13830 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13840 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
13850 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
13860 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
13870 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
13880 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20  if (*pulCount < 
13890 33 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  3) {...CACKEY_DE
138a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
138b0 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73  r.  Buffer too s
138c0 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  mall.");....retu
138d0 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  rn(CKR_BUFFER_TO
138e0 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70  O_SMALL);..}...p
138f0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d  MechanismList[0]
13900 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b   = CKM_RSA_PKCS;
13910 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  ..pMechanismList
13920 5b 31 5d 20 3d 20 43 4b 4d 5f 53 48 41 31 5f 52  [1] = CKM_SHA1_R
13930 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f  SA_PKCS;..*pulCo
13940 75 6e 74 20 3d 20 32 3b 0a 0a 09 43 41 43 4b 45  unt = 2;...CACKE
13950 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13960 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
13970 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
13980 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
13990 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
139a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
139b0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
139c0 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
139d0 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
139e0 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43  ISM_TYPE type, C
139f0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f  K_MECHANISM_INFO
13a00 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
13a10 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
13a20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13a30 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
13a40 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
13a50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
13a60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13a70 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
13a80 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
13a90 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
13aa0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
13ab0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
13ac0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
13ad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13ae0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
13af0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
13b00 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
13b10 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
13b20 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
13b30 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
13b40 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
13b50 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
13b60 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
13b70 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
13b80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13b90 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
13ba0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
13bb0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
13bc0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
13bd0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
13be0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
13bf0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
13c00 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
13c10 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
13c20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
13c30 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
13c40 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
13c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13c60 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
13c70 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
13c80 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
13c90 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
13ca0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
13cb0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
13cc0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
13cd0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13ce0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
13cf0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
13d00 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
13d10 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
13d20 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
13d30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
13d40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
13d50 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
13d60 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
13d70 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
13d80 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
13d90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
13da0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
13db0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
13dc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13dd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
13de0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
13df0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
13e00 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
13e10 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20  );..}.../* XXX: 
13e20 54 68 69 73 20 69 73 20 75 6e 74 65 73 74 65 64  This is untested
13e30 2c 20 61 6e 64 20 66 75 72 74 68 65 72 20 49 27  , and further I'
13e40 6d 20 6e 6f 74 20 72 65 61 6c 6c 79 20 73 75 72  m not really sur
13e50 65 20 69 66 20 74 68 69 73 20 69 73 20 63 6f 72  e if this is cor
13e60 72 65 63 74 2e 20 2a 2f 0a 09 73 77 69 74 63 68  rect. */..switch
13e70 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65   (type) {...case
13e80 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
13e90 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65  ..pInfo->ulMinKe
13ea0 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09  ySize = 512;....
13eb0 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53  pInfo->ulMaxKeyS
13ec0 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70  ize = 8192;....p
13ed0 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
13ee0 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59  F_HW | CKF_ENCRY
13ef0 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54  PT | CKF_DECRYPT
13f00 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b   | CKF_SIGN | CK
13f10 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65  F_VERIFY;....bre
13f20 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ak;...case CKM_R
13f30 53 41 5f 58 5f 35 30 39 3a 0a 09 09 09 70 49 6e  SA_X_509:....pIn
13f40 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
13f50 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
13f60 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
13f70 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
13f80 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
13f90 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
13fa0 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
13fb0 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
13fc0 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
13fd0 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52  .case CKM_SHA1_R
13fe0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66  SA_PKCS:....pInf
13ff0 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20  o->ulMinKeySize 
14000 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d  = 512;....pInfo-
14010 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20  >ulMaxKeySize = 
14020 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e  8192;....pInfo->
14030 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c  flags = CKF_HW |
14040 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f   CKF_SIGN | CKF_
14050 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b  VERIFY;....break
14060 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
14070 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
14080 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
14090 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
140a0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
140b0 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
140c0 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
140d0 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
140e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
140f0 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f  C_InitToken)(CK_
14100 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
14110 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
14120 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
14130 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  lPinLen, CK_UTF8
14140 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29  CHAR_PTR pLabel)
14150 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
14160 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
14170 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
14180 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
14190 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
141a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
141b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
141c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
141d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
141e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
141f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14200 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
14210 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
14220 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
14230 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
14240 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
14250 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
14260 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
14270 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
14280 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
14290 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
142a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
142b0 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43  RV, C_InitPIN)(C
142c0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
142d0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54   hSession, CK_UT
142e0 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
142f0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
14300 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
14310 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
14320 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
14330 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
14340 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14350 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
14360 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
14370 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
14380 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
14390 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
143a0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
143b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
143c0 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
143d0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
143e0 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
143f0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
14400 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
14410 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
14420 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
14430 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
14440 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
14450 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
14460 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29  CK_RV, C_SetPIN)
14470 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
14480 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
14490 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c  UTF8CHAR_PTR pOl
144a0 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  dPin, CK_ULONG u
144b0 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  lOldPinLen, CK_U
144c0 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77  TF8CHAR_PTR pNew
144d0 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
144e0 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41  NewPinLen) {..CA
144f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14500 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
14510 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
14520 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
14530 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14540 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
14550 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
14560 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
14570 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
14580 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
14590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
145a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
145b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
145c0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
145d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
145e0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
145f0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
14600 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
14610 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
14620 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f  CTION(CK_RV, C_O
14630 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  penSession)(CK_S
14640 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
14650 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43  K_FLAGS flags, C
14660 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
14670 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49  ication, CK_NOTI
14680 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45  FY notify, CK_SE
14690 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52  SSION_HANDLE_PTR
146a0 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75   phSession) {..u
146b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78  nsigned long idx
146c0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
146d0 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f  val;..int found_
146e0 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43  session = 0;...C
146f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14700 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
14710 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b  .if ((flags & CK
14720 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e  F_SERIAL_SESSION
14730 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f  ) != CKF_SERIAL_
14740 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74  SESSION) {...ret
14750 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
14760 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50  PARALLEL_NOT_SUP
14770 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  PORTED);..}...if
14780 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
14790 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
147a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
147b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
147c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
147d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
147e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
147f0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
14800 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
14810 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
14820 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
14830 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
14840 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
14850 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14860 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
14870 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
14880 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
14890 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
148a0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
148b0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
148c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
148d0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
148e0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
148f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
14900 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
14910 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
14920 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14930 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
14940 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
14950 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
14960 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
14970 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
14980 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
14990 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
149a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
149b0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
149c0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
149d0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
149e0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
149f0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
14a00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
14a10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
14a20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
14a30 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
14a40 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
14a50 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61  at the card is a
14a60 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73  ctually in the s
14a70 6c 6f 74 2e 20 2a 2f 0a 09 69 66 20 28 63 61 63  lot. */..if (cac
14a80 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
14a90 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
14aa0 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b  slotID]) != CACK
14ab0 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
14ac0 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  RESENT) {...CACK
14ad0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14ae0 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f  "Error.  Card no
14af0 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75  t present.  Retu
14b00 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45  rning CKR_DEVICE
14b10 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63  _REMOVED");....c
14b20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
14b30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
14b40 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
14b50 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
14b60 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
14b70 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 1; idx < (siz
14b80 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
14b90 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
14ba0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
14bb0 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
14bc0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
14bd0 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
14be0 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73   {....found_sess
14bf0 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68  ion = 1;.....*ph
14c00 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a  Session = idx;..
14c10 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
14c20 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
14c30 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   1;....cackey_se
14c40 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
14c50 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09  ID = slotID;....
14c60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
14c70 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  idx].state = CKS
14c80 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49  _RO_PUBLIC_SESSI
14c90 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ON;....cackey_se
14ca0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67  ssions[idx].flag
14cb0 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61  s = flags;....ca
14cc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
14cd0 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  x].ulDeviceError
14ce0 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
14cf0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41  sessions[idx].pA
14d00 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70  pplication = pAp
14d10 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61  plication;....ca
14d20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
14d30 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69  x].Notify = noti
14d40 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  fy;.....cackey_s
14d50 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
14d60 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
14d70 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
14d80 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
14d90 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  es_count = 0;...
14da0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
14db0 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63  s[idx].search_ac
14dc0 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
14dd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
14de0 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  x].sign_active =
14df0 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
14e00 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63  essions[idx].dec
14e10 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
14e20 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
14e30 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
14e40 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
14e50 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
14e60 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
14e70 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
14e80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14e90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14ea0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
14eb0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
14ec0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
14ed0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66  OR);..}...if (!f
14ee0 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a  ound_session) {.
14ef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14f00 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
14f10 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55   CKR_SESSION_COU
14f20 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45  NT (%i)", CKR_SE
14f30 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09  SSION_COUNT);...
14f40 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
14f50 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a  ION_COUNT);..}..
14f60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14f70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
14f80 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
14f90 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
14fa0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
14fb0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
14fc0 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73  K_RV, C_CloseSes
14fd0 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  sion)(CK_SESSION
14fe0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
14ff0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
15000 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
15010 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
15020 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
15030 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
15040 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
15050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
15060 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
15070 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
15080 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
15090 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
150a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
150b0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
150c0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
150d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
150e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
150f0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
15100 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15110 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
15120 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
15130 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
15140 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
15150 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
15160 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
15170 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
15180 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
15190 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
151a0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
151b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
151c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
151d0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
151e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
151f0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
15200 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
15210 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
15220 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
15230 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
15240 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
15250 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
15260 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15270 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
15280 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
15290 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
152a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
152b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
152c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
152d0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d  ession].active =
152e0 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65   0;..cackey_free
152f0 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b  _identities(cack
15300 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
15310 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
15320 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
15330 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
15340 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
15350 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
15360 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
15370 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
15380 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
15390 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
153a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
153b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
153c0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
153d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
153e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
153f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
15400 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
15410 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
15420 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
15430 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
15440 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
15450 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f  ION(CK_RV, C_Clo
15460 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43  seAllSessions)(C
15470 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
15480 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
15490 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
154a0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
154b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
154c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
154d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
154e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
154f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15500 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
15510 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
15520 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
15530 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
15540 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
15550 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
15560 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
15570 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
15580 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
15590 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
155a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
155b0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
155c0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
155d0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
155e0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
155f0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
15600 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
15610 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
15620 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
15630 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
15640 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
15650 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
15660 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
15670 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15680 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
15690 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
156a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
156b0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
156c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
156d0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
156e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
156f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
15700 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
15710 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
15720 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
15730 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
15740 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
15750 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
15760 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
15770 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
15780 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
15790 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
157a0 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
157b0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
157c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
157d0 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
157e0 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
157f0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
15800 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20  active) {....if 
15810 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
15820 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20  [idx].slotID != 
15830 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f  slotID) {.....co
15840 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
15850 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
15860 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
15870 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65  ock);....C_Close
15880 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09  Session(idx);...
15890 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f  .cackey_mutex_lo
158a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
158b0 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  k);...}..}...mut
158c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
158d0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
158e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
158f0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
15900 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
15910 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15920 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
15930 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
15940 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
15950 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
15960 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15970 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15980 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
15990 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
159a0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
159b0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
159c0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73  CK_RV, C_GetSess
159d0 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53  ionInfo)(CK_SESS
159e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
159f0 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion, CK_SESSION_
15a00 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
15a10 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
15a20 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
15a30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
15a40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
15a50 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
15a60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15a70 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
15a80 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
15a90 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
15aa0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
15ab0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
15ac0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
15ad0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15ae0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
15af0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
15b00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
15b10 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
15b20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
15b30 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
15b40 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
15b50 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
15b60 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
15b70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
15b80 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
15b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
15ba0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
15bb0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
15bc0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
15bd0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
15be0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
15bf0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
15c00 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
15c10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
15c20 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
15c30 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
15c40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15c50 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
15c60 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
15c70 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
15c80 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
15c90 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
15ca0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
15cb0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
15cc0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
15cd0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
15ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15cf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
15d00 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
15d10 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
15d20 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
15d30 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
15d40 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49  }...pInfo->slotI
15d50 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
15d60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
15d70 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74  otID;..pInfo->st
15d80 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ate = cackey_ses
15d90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
15da0 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66  state;..pInfo->f
15db0 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65  lags = cackey_se
15dc0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
15dd0 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e  .flags;..pInfo->
15de0 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20  ulDeviceError = 
15df0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
15e00 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69  hSession].ulDevi
15e10 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78  ceError;...mutex
15e20 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
15e30 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
15e40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
15e50 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
15e60 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
15e70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15e80 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
15e90 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
15ea0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
15eb0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
15ec0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15ed0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
15ee0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
15ef0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
15f00 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
15f10 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
15f20 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74  _RV, C_GetOperat
15f30 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53  ionState)(CK_SES
15f40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
15f50 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
15f60 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  R pOperationStat
15f70 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
15f80 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  pulOperationStat
15f90 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
15fa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
15fb0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
15fc0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
15fd0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
15fe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
15ff0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
16000 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
16010 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
16020 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
16030 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
16040 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
16050 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
16060 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
16070 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
16080 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
16090 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
160a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
160b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
160c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
160d0 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65  (CK_RV, C_SetOpe
160e0 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f  rationState)(CK_
160f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
16100 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
16110 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53  _PTR pOperationS
16120 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  tate, CK_ULONG u
16130 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c  lOperationStateL
16140 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  en, CK_OBJECT_HA
16150 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e  NDLE hEncryption
16160 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Key, CK_OBJECT_H
16170 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63  ANDLE hAuthentic
16180 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43  ationKey) {..CAC
16190 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
161a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
161b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
161c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
161d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
161e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
161f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
16200 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
16210 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
16220 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
16230 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16240 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
16250 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
16260 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
16270 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
16280 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
16290 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
162a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
162b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
162c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
162d0 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  gin)(CK_SESSION_
162e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
162f0 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73   CK_USER_TYPE us
16300 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43  erType, CK_UTF8C
16310 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
16320 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
16330 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
16340 74 76 61 6c 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e  tval;..int login
16350 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
16360 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
16370 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
16380 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
16390 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
163a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
163b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
163c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
163d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
163e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
163f0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
16400 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
16410 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
16420 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
16430 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
16440 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
16450 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16460 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
16470 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
16480 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
16490 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
164a0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
164b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54  ;..}...if (userT
164c0 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29  ype != CKU_USER)
164d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
164e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
164f0 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72    We only suppor
16500 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b  t USER mode, ask
16510 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e  ed for %lu mode.
16520 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
16530 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09  g) userType)....
16540 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f  return(CKR_USER_
16550 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  TYPE_INVALID);..
16560 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
16570 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
16580 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
16590 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
165a0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
165b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
165c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
165d0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
165e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
165f0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
16600 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
16610 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
16620 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
16630 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
16640 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
16650 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
16660 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16670 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
16680 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
16690 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
166a0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
166b0 49 44 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f  ID);..}...login_
166c0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67  ret = cackey_log
166d0 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  in(&cackey_slots
166e0 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  [cackey_sessions
166f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
16700 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c  D], pPin, ulPinL
16710 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  en, NULL);..if (
16720 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43  login_ret != CAC
16730 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
16740 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
16750 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
16760 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c  glock);....if (l
16770 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
16780 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
16790 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
167a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
167b0 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63  r.  Token is loc
167c0 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  ked.");.....retu
167d0 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45  rn(CKR_PIN_LOCKE
167e0 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20  D);...} else if 
167f0 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41  (login_ret == CA
16800 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
16810 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  IN) {....CACKEY_
16820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16830 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49  ror.  Invalid PI
16840 4e 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  N.");.....return
16850 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
16860 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  CT);...}....CACK
16870 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16880 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e  "Error.  Unknown
16890 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20   error returned 
168a0 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69  from cackey_logi
168b0 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e  n() (%i)", login
168c0 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
168d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
168e0 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  OR);..}...cackey
168f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
16900 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  on].state = CKS_
16910 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e  RO_USER_FUNCTION
16920 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  S;...mutex_retva
16930 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
16940 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
16950 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
16960 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
16970 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16980 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16990 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
169a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
169b0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
169c0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
169d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
169e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
169f0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
16a00 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
16a10 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
16a20 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
16a30 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53  _Logout)(CK_SESS
16a40 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
16a50 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  ion) {..int mute
16a60 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
16a70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16a80 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
16a90 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
16aa0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
16ab0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16ac0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
16ad0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
16ae0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
16af0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
16b00 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
16b10 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
16b20 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
16b30 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
16b40 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
16b50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
16b60 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
16b70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16b80 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
16b90 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
16ba0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
16bb0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
16bc0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
16bd0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
16be0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
16bf0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
16c00 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
16c10 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
16c20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
16c30 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
16c40 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
16c50 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
16c60 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
16c70 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
16c80 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
16c90 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
16ca0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
16cb0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
16cc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16cd0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
16ce0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
16cf0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
16d00 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
16d10 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
16d20 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
16d30 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
16d40 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
16d50 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 6d 75 74 65  _SESSION;...mute
16d60 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
16d70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
16d80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
16d90 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
16da0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
16db0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16dc0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
16dd0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
16de0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
16df0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
16e00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16e10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
16e20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
16e30 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
16e40 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
16e50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
16e60 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62  K_RV, C_CreateOb
16e70 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ject)(CK_SESSION
16e80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
16e90 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
16ea0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
16eb0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
16ec0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
16ed0 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b  _PTR phObject) {
16ee0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16ef0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
16f00 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
16f10 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
16f20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16f30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
16f40 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
16f50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
16f60 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
16f70 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
16f80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16f90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
16fa0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
16fb0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
16fc0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
16fd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
16fe0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
16ff0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
17000 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
17010 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
17020 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43   C_CopyObject)(C
17030 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
17040 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
17050 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
17060 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
17070 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
17080 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
17090 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
170a0 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a  DLE_PTR phNewObj
170b0 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ect) {..CACKEY_D
170c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
170d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
170e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
170f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
17100 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17110 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
17120 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
17130 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
17140 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
17150 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
17160 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
17170 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
17180 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
17190 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
171a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
171b0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
171c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
171d0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
171e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
171f0 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79  CK_RV, C_Destroy
17200 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
17210 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
17220 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
17230 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a  NDLE hObject) {.
17240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17250 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
17260 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
17270 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
17280 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17290 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
172a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
172b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
172c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
172d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
172e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
172f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
17300 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
17310 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
17320 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
17330 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
17340 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
17350 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
17360 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
17370 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
17380 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29  C_GetObjectSize)
17390 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
173a0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
173b0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
173c0 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  bject, CK_ULONG_
173d0 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09  PTR pulSize) {..
173e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
173f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
17400 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
17410 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
17420 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17430 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
17440 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
17450 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
17460 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
17470 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
17480 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17490 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
174a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
174b0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
174c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
174d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
174e0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
174f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
17500 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
17510 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
17520 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
17530 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ue)(CK_SESSION_H
17540 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
17550 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
17560 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
17570 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
17580 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
17590 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54  lCount) {..CK_AT
175a0 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
175b0 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  tr;..struct cack
175c0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
175d0 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64  ntity;..unsigned
175e0 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69   long identity_i
175f0 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65  dx, attr_idx, se
17600 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d  ss_attr_idx, num
17610 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ids;..int mutex
17620 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
17630 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
17640 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56  ..CK_VOID_PTR pV
17650 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  alue;..CK_ULONG 
17660 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41  ulValueLen;...CA
17670 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17680 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
17690 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
176a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
176b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
176c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
176d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
176e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
176f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
17700 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
17710 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
17720 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
17730 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
17740 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
17750 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
17760 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
17770 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17780 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
17790 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
177a0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
177b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
177c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
177d0 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b  (hObject == 0) {
177e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
177f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
17800 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75  Object handle ou
17810 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
17820 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
17830 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56  BJECT_HANDLE_INV
17840 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
17850 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ulCount == 0) {.
17860 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
17870 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65  it, if zero obje
17880 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69  cts were specifi
17890 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  ed return zero i
178a0 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  tems immediately
178b0 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
178c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
178d0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
178e0 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
178f0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
17900 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
17910 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74  }...if (pTemplat
17920 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
17930 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17940 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d  TF("Error.  pTem
17950 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29  plate is NULL.")
17960 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17970 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
17980 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69 64  .}...identity_id
17990 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b  x = hObject - 1;
179a0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
179b0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
179c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
179d0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
179e0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
179f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17a00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
17a10 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
17a20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
17a30 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
17a40 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
17a50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
17a60 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
17a70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
17a80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
17a90 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
17aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17ab0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
17ac0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
17ad0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
17ae0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
17af0 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73  D);..}...num_ids
17b00 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
17b10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
17b20 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a  ntities_count;..
17b30 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64  .if (identity_id
17b40 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a  x >= num_ids) {.
17b50 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
17b60 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
17b70 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
17b80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17b90 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61  rror.  Object ha
17ba0 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
17bb0 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78  e.  identity_idx
17bc0 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20   = %lu, num_ids 
17bd0 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e  = %lu.", (unsign
17be0 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74  ed long) identit
17bf0 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64  y_idx, (unsigned
17c00 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b   long) num_ids);
17c10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
17c20 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56  BJECT_HANDLE_INV
17c30 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e  ALID);..}...iden
17c40 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73  tity = &cackey_s
17c50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
17c60 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65  ].identities[ide
17c70 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f  ntity_idx];...fo
17c80 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  r (attr_idx = 0;
17c90 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f   attr_idx < ulCo
17ca0 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29  unt; attr_idx++)
17cb0 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d   {...curr_attr =
17cc0 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72   &pTemplate[attr
17cd0 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65  _idx];....pValue
17ce0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c   = NULL;...ulVal
17cf0 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
17d00 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ) -1;....CACKEY_
17d10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f  DEBUG_PRINTF("Lo
17d20 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62  oking for attrib
17d30 75 74 65 20 30 78 25 30 38 6c 78 20 28 69 64 65  ute 0x%08lx (ide
17d40 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c  ntity:%lu) ...",
17d50 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17d60 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65   curr_attr->type
17d70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17d80 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b  ) identity_idx);
17d90 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74  ....for (sess_at
17da0 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73  tr_idx = 0; sess
17db0 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e  _attr_idx < iden
17dc0 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
17dd0 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74  _count; sess_att
17de0 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66  r_idx++) {....if
17df0 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72   (identity->attr
17e00 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
17e10 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75  _idx].type == cu
17e20 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b  rr_attr->type) {
17e30 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17e40 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66  G_PRINTF(" ... f
17e50 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20  ound it, pValue 
17e60 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e  = %p, ulValueLen
17e70 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74   = %lu", identit
17e80 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
17e90 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61  ss_attr_idx].pVa
17ea0 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61  lue, identity->a
17eb0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
17ec0 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
17ed0 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70  Len);..........p
17ee0 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79  Value = identity
17ef0 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
17f00 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c  s_attr_idx].pVal
17f10 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
17f20 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61  en = identity->a
17f30 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
17f40 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
17f50 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  Len;....}...}...
17f60 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e  .if (curr_attr->
17f70 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65  pValue && pValue
17f80 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f  ) {....if (curr_
17f90 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
17fa0 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20   >= ulValueLen) 
17fb0 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72  {.....memcpy(cur
17fc0 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20  r_attr->pValue, 
17fd0 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c  pValue, ulValueL
17fe0 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  en);....} else {
17ff0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18000 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
18010 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
18020 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
18030 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  LL;....}...}....
18040 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
18050 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c  ueLen = ulValueL
18060 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  en;..}...mutex_r
18070 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
18080 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
18090 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
180a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
180b0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
180c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
180d0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
180e0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
180f0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
18100 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
18110 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f   (retval == CKR_
18120 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49  ATTRIBUTE_TYPE_I
18130 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b  NVALID) {...CACK
18140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18150 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41  "Returning CKR_A
18160 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e  TTRIBUTE_TYPE_IN
18170 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e  VALID (%i)", (in
18180 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65  t) retval);..} e
18190 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d  lse if (retval =
181a0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
181b0 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  _SMALL) {...CACK
181c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
181d0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42  "Returning CKR_B
181e0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20  UFFER_TOO_SMALL 
181f0 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74  (%i)", (int) ret
18200 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66  val);..} else if
18210 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f   (retval == CKR_
18220 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
18230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
18240 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
18250 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  i)", (int) retva
18260 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  l);..} else {...
18270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18280 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
18290 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  i", (int) retval
182a0 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72  );..}...return(r
182b0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
182c0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
182d0 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62  _RV, C_SetAttrib
182e0 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53  uteValue)(CK_SES
182f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
18300 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
18310 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
18320 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
18330 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
18340 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a  LONG ulCount) {.
18350 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18360 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
18370 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
18380 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
18390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
183a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
183b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
183c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
183d0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
183e0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
183f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18400 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
18410 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
18420 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
18430 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
18440 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
18450 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
18460 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
18470 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
18480 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
18490 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
184a0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
184b0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
184c0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
184d0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
184e0 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
184f0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
18500 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
18510 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73  c_identities;..s
18520 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
18530 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
18540 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
18550 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64  g num_ids, id_id
18560 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b  x, curr_id_type;
18570 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
18580 6e 75 6d 5f 63 65 72 74 73 2c 20 63 65 72 74 5f  num_certs, cert_
18590 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
185a0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
185b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
185c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
185d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
185e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
185f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18600 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
18610 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
18620 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
18630 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
18640 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
18650 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
18660 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
18670 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
18680 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
18690 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
186a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
186b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
186c0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
186d0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
186e0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
186f0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
18700 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
18710 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
18720 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
18730 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
18740 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
18750 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
18760 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18770 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
18780 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18790 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
187a0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
187b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
187c0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
187d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
187e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
187f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
18800 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18810 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
18820 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
18830 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
18840 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
18850 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
18860 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
18870 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
18880 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  rch_active) {...
18890 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
188a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
188b0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
188c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
188d0 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65  or.  Search alre
188e0 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  ady active.");..
188f0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
18900 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
18910 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
18920 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73  y_slots[cackey_s
18930 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18940 5d 2e 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  ].slotID].slot_r
18950 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  eset) {...CACKEY
18960 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
18970 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e  he slot has been
18980 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 20   reset since we 
18990 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20  last looked for 
189a0 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65  identities -- re
189b0 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69  scanning");....i
189c0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
189d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
189e0 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
189f0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65   {....cackey_fre
18a00 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63  e_identities(cac
18a10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
18a20 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
18a30 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  s, cackey_sessio
18a40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
18a50 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
18a60 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
18a70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
18a80 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
18a90 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
18aa0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
18ab0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
18ac0 20 30 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65   0;...}....cacke
18ad0 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73  y_slots[cackey_s
18ae0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18af0 5d 2e 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  ].slotID].slot_r
18b00 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  eset = 0;..}...i
18b10 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
18b20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
18b30 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29  ntities == NULL)
18b40 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69   {...pcsc_identi
18b50 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
18b60 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79  ad_certs(&cackey
18b70 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65  _slots[cackey_se
18b80 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
18b90 2e 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20  .slotID], NULL, 
18ba0 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69  &num_certs);...i
18bb0 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  f (pcsc_identiti
18bc0 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
18bd0 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62  ./* Convert numb
18be0 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20 6e  er of Certs to n
18bf0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
18c00 20 2a 2f 0a 09 09 09 6e 75 6d 5f 69 64 73 20 3d   */....num_ids =
18c10 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45   (CKO_PRIVATE_KE
18c20 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  Y - CKO_CERTIFIC
18c30 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63  ATE + 1) * num_c
18c40 65 72 74 73 3b 0a 0a 09 09 09 69 64 65 6e 74 69  erts;.....identi
18c50 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75  ties = malloc(nu
18c60 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a  m_ids * sizeof(*
18c70 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09  identities));...
18c80 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09  ..id_idx = 0;...
18c90 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d  .for (cert_idx =
18ca0 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e   0; cert_idx < n
18cb0 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69  um_certs; cert_i
18cc0 64 78 2b 2b 29 20 7b 0a 09 09 09 09 66 6f 72 20  dx++) {.....for 
18cd0 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20  (curr_id_type = 
18ce0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b  CKO_CERTIFICATE;
18cf0 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d   curr_id_type <=
18d00 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
18d10 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b  ; curr_id_type++
18d20 29 20 7b 0a 09 09 09 09 09 69 64 65 6e 74 69 74  ) {......identit
18d30 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
18d40 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
18d50 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63  get_attributes(c
18d60 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63  urr_id_type, &pc
18d70 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
18d80 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64  rt_idx], cert_id
18d90 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
18da0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
18db0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 09  s_count);.......
18dc0 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69  if (identities[i
18dd0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
18de0 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s == NULL) {....
18df0 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
18e00 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
18e10 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09  _count = 0;.....
18e20 09 7d 0a 0a 09 09 09 09 09 69 64 5f 69 64 78 2b  .}.......id_idx+
18e30 2b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  +;.....}....}...
18e40 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
18e50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
18e60 74 69 74 69 65 73 20 3d 20 69 64 65 6e 74 69 74  tities = identit
18e70 69 65 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ies;....cackey_s
18e80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18e90 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
18ea0 6e 74 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09  nt = num_ids;...
18eb0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
18ec0 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
18ed0 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
18ee0 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  1);...}..}...if 
18ef0 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55  (pTemplate != NU
18f00 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  LL) {...if (ulCo
18f10 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
18f20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
18f30 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
18f40 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c  query_count = ul
18f50 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79  Count;....cackey
18f60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
18f70 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
18f80 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e   = malloc(ulCoun
18f90 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
18fa0 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d  plate));.....mem
18fb0 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
18fc0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
18fd0 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d  arch_query, pTem
18fe0 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a  plate, ulCount *
18ff0 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
19000 74 65 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  te));...} else {
19010 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
19020 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
19030 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
19040 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
19050 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
19060 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
19070 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65  = NULL;...}..} e
19080 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  lse {...if (ulCo
19090 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
190a0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
190b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
190c0 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  k);.....CACKEY_D
190d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
190e0 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75 65 72  or.  Search quer
190f0 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  y specified as N
19100 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20  ULL, but number 
19110 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e  of query terms n
19120 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
19130 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  0.");.....return
19140 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
19150 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  AD);...}....cack
19160 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
19170 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
19180 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ry_count = 0;...
19190 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
191a0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
191b0 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
191c0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
191d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
191e0 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b  arch_active = 1;
191f0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
19200 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
19210 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a  ch_curr_id = 0;.
19220 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
19230 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
19240 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
19250 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
19260 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
19270 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19280 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
19290 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
192a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
192b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
192c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
192d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
192e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
192f0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
19300 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
19310 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
19320 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
19330 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45  ndObjects)(CK_SE
19340 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
19350 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
19360 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62  _HANDLE_PTR phOb
19370 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ject, CK_ULONG u
19380 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c  lMaxObjectCount,
19390 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
193a0 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a  lObjectCount) {.
193b0 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
193c0 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64  dentity *curr_id
193d0 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  ;..CK_ATTRIBUTE 
193e0 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f  *curr_attr;..CK_
193f0 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64  ULONG curr_id_id
19400 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  x, curr_out_id_i
19410 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64  dx, curr_attr_id
19420 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
19430 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63  ;..CK_ULONG matc
19440 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f  hed_count, prev_
19450 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09  matched_count;..
19460 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
19470 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
19480 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
19490 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
194a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
194b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
194c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
194d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
194e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
194f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
19500 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
19510 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43  ..if (pulObjectC
19520 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
19530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19540 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
19550 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73  ulObjectCount is
19560 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
19570 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
19580 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
19590 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c  (phObject == NUL
195a0 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74  L && ulMaxObject
195b0 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  Count == 0) {...
195c0 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
195d0 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74  , if zero object
195e0 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
195f0 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65   return zero ite
19600 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  ms immediately *
19610 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  /...*pulObjectCo
19620 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b  unt = 0;....CACK
19630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19640 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
19650 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
19660 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
19670 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
19680 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68  OK);..}...if (ph
19690 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20  Object == NULL) 
196a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
196b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
196c0 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c   phObject is NUL
196d0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
196e0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
196f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d  D);..}...if (ulM
19700 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d  axObjectCount ==
19710 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
19720 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19730 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  or.  Maximum num
19740 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73  ber of objects s
19750 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f  pecified as zero
19760 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
19770 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
19780 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
19790 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
197a0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
197b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
197c0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
197d0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
197e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
197f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
19800 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
19810 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
19820 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
19830 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
19840 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
19850 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
19860 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
19870 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
19880 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
19890 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
198a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
198b0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
198c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
198d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
198e0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
198f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19900 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
19910 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
19920 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
19930 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
19940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19950 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
19960 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
19970 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
19980 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
19990 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
199a0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
199b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
199c0 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
199d0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
199e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
199f0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
19a00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
19a10 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
19a20 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
19a30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
19a40 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
19a50 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 75 72  LIZED);..}...cur
19a60 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30  r_out_id_idx = 0
19a70 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f  ;..for (curr_id_
19a80 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  idx = cackey_ses
19a90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
19aa0 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20  search_curr_id; 
19ab0 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61  curr_id_idx < ca
19ac0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
19ad0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
19ae0 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61  es_count && ulMa
19af0 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75  xObjectCount; cu
19b00 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09  rr_id_idx++) {..
19b10 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b  .curr_id = &cack
19b20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
19b30 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
19b40 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a  [curr_id_idx];..
19b50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19b60 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e  RINTF("Processin
19b70 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c  g identity:%lu",
19b80 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19b90 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a   curr_id_idx);..
19ba0 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  ..matched_count 
19bb0 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72  = 0;....for (cur
19bc0 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  r_attr_idx = 0; 
19bd0 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20  curr_attr_idx < 
19be0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
19bf0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
19c00 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75  _query_count; cu
19c10 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  rr_attr_idx++) {
19c20 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64  ....prev_matched
19c30 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64  _count = matched
19c40 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72  _count;.....curr
19c50 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f  _attr = &cackey_
19c60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
19c70 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
19c80 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a  curr_attr_idx];.
19c90 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19ca0 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b  _PRINTF("  Check
19cb0 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74  ing for attribut
19cc0 65 20 30 78 25 30 38 6c 78 20 69 6e 20 69 64 65  e 0x%08lx in ide
19cd0 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 28 75  ntity:%i...", (u
19ce0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
19cf0 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28  rr_attr->type, (
19d00 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
19d10 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
19d20 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
19d30 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66   Value looking f
19d40 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d  or:", curr_attr-
19d50 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74  >pValue, curr_at
19d60 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  tr->ulValueLen);
19d70 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61  .....for (sess_a
19d80 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73  ttr_idx = 0; ses
19d90 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72  s_attr_idx < cur
19da0 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
19db0 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74  _count; sess_att
19dc0 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69  r_idx++) {.....i
19dd0 66 20 28 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  f (curr_id->attr
19de0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
19df0 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75  _idx].type == cu
19e00 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b  rr_attr->type) {
19e10 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19e20 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 2e  UG_PRINTF("    .
19e30 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e  .. found matchin
19e40 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 09 09  g type ...");...
19e50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19e60 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e  PRINTBUF("    ..
19e70 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 63  . our value:", c
19e80 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
19e90 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
19ea0 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69  ].pValue, curr_i
19eb0 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
19ec0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
19ed0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 09  alueLen);.......
19ee0 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
19ef0 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Value == NULL) {
19f00 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
19f10 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
19f20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c     ... found wil
19f30 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a  dcard match");..
19f40 09 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f  ......matched_co
19f50 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72  unt++;........br
19f60 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 20 09 09  eak;......}.. ..
19f70 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
19f80 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20  ->ulValueLen == 
19f90 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
19fa0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
19fb0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26  x].ulValueLen &&
19fc0 20 6d 65 6d 63 6d 70 28 63 75 72 72 5f 61 74 74   memcmp(curr_att
19fd0 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  r->pValue, curr_
19fe0 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
19ff0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
1a000 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61  alue, curr_id->a
1a010 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
1a020 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
1a030 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09  Len) == 0) {....
1a040 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a050 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
1a060 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d  .. found exact m
1a070 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 09 09 6d  atch");........m
1a080 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a  atched_count++;.
1a090 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1a0a0 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  ...}.....}....}.
1a0b0 0a 09 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74  ..../* If the at
1a0c0 74 72 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f  tribute could no
1a0d0 74 20 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f  t be matched, do
1a0e0 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63   not try to matc
1a0f0 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74  h additional att
1a100 72 69 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66  ributes */....if
1a110 20 28 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63   (prev_matched_c
1a120 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f  ount == matched_
1a130 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65  count) {.....bre
1a140 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ak;....}...}....
1a150 69 66 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e  if (matched_coun
1a160 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  t == cackey_sess
1a170 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1a180 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
1a190 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
1a1a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
1a1b0 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62  .. All %i attrib
1a1c0 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72  utes checked for
1a1d0 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69   found, adding i
1a1e0 64 65 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65  dentity:%i to re
1a1f0 74 75 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69  turned list", (i
1a200 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  nt) cackey_sessi
1a210 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1a220 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
1a230 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f  , (int) curr_id_
1a240 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65  idx);.....phObje
1a250 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ct[curr_out_id_i
1a260 64 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64  dx] = curr_id_id
1a270 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78  x + 1;.....ulMax
1a280 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a  ObjectCount--;..
1a290 09 09 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ...curr_out_id_i
1a2a0 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  dx++;...} else {
1a2b0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a2c0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e  _PRINTF("  ... N
1a2d0 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20  ot all %i (only 
1a2e0 66 6f 75 6e 64 20 25 69 29 20 61 74 74 72 69 62  found %i) attrib
1a2f0 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72  utes checked for
1a300 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69   found, not addi
1a310 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c  ng identity:%i",
1a320 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65   (int) cackey_se
1a330 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1a340 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
1a350 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68  unt, (int) match
1a360 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  ed_count, (int) 
1a370 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09  curr_id_idx);...
1a380 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73  }..}..cackey_ses
1a390 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1a3a0 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d  search_curr_id =
1a3b0 20 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a   curr_id_idx;..*
1a3c0 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  pulObjectCount =
1a3d0 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78   curr_out_id_idx
1a3e0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
1a3f0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1a400 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1a410 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1a420 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1a430 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a440 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a450 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1a460 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1a470 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1a480 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1a490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a4a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1a4b0 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73  %i), num objects
1a4c0 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c   = %lu", CKR_OK,
1a4d0 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74   *pulObjectCount
1a4e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1a4f0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1a500 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1a510 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  , C_FindObjectsF
1a520 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
1a530 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1a540 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
1a550 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
1a560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1a570 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1a580 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1a590 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1a5a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a5b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1a5c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1a5d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1a5e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1a5f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
1a600 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
1a610 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
1a620 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1a630 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1a640 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
1a650 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a660 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a670 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
1a680 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
1a690 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1a6a0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1a6b0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1a6c0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1a6d0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1a6e0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1a6f0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1a700 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a710 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a720 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1a730 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1a740 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1a750 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
1a760 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1a770 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
1a780 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1a790 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1a7a0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1a7b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a7c0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1a7d0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1a7e0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1a7f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1a800 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
1a810 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1a820 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
1a830 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  rch_active) {...
1a840 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1a850 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1a860 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1a870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a880 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20  or.  Search not 
1a890 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1a8a0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
1a8b0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
1a8c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  IZED);..}...cack
1a8d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1a8e0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
1a8f0 69 76 65 20 3d 20 30 3b 0a 09 69 66 20 28 63 61  ive = 0;..if (ca
1a900 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1a910 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
1a920 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63  uery) {...free(c
1a930 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a940 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1a950 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74  query);..}...mut
1a960 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1a970 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1a980 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1a990 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1a9a0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1a9b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a9c0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1a9d0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1a9e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1a9f0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1aa00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1aa10 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1aa20 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1aa30 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1aa40 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1aa50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1aa60 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
1aa70 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
1aa80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1aa90 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
1aaa0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
1aab0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1aac0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
1aad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1aae0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1aaf0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1ab00 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1ab10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ab20 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1ab30 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1ab40 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1ab50 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1ab60 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1ab70 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1ab80 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1ab90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1aba0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1abb0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1abc0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1abd0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1abe0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1abf0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1ac00 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
1ac10 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
1ac20 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1ac30 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
1ac40 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
1ac50 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
1ac60 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  R pEncryptedData
1ac70 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1ac80 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
1ac90 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1aca0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1acb0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1acc0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1acd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ace0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1acf0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1ad00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1ad10 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1ad20 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1ad30 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1ad40 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1ad50 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1ad60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1ad70 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1ad80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1ad90 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1ada0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1adb0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1adc0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1add0 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55  K_RV, C_EncryptU
1ade0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
1adf0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1ae00 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1ae10 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
1ae20 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
1ae30 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
1ae40 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
1ae50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
1ae60 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
1ae70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ae80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1ae90 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1aea0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1aeb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1aec0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1aed0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1aee0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1aef0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1af00 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1af10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1af20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1af30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1af40 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1af50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1af60 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1af70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1af80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1af90 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1afa0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
1afb0 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
1afc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1afd0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1afe0 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64  R pLastEncrypted
1aff0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
1b000 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70  TR pulLastEncryp
1b010 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
1b020 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b030 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1b040 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1b050 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1b060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b070 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1b080 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1b090 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1b0a0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1b0b0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1b0c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b0d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1b0e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b0f0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1b100 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1b110 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1b120 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1b130 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1b140 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1b150 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1b160 44 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f  DecryptInit)(CK_
1b170 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1b180 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
1b190 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
1b1a0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
1b1b0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
1b1c0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1b1d0 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
1b1e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b1f0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1b200 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1b210 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1b220 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b230 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1b240 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1b250 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1b260 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1b270 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1b280 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
1b290 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1b2a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b2b0 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
1b2c0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1b2d0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1b2e0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1b2f0 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
1b300 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
1b310 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43  SA_PKCS) {...CAC
1b320 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b330 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
1b340 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e  ism->mechanism n
1b350 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
1b360 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a  CKM_RSA_PKCS");.
1b370 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45  ...return(CKR_ME
1b380 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e  CHANISM_PARAM_IN
1b390 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1b3a0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
1b3b0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
1b3c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1b3d0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1b3e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b3f0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1b400 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b410 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
1b420 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
1b430 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1b440 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1b450 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1b460 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1b470 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1b480 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1b490 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1b4a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1b4b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b4c0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1b4d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1b4e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1b4f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1b500 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1b510 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1b520 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1b530 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1b540 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1b550 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b560 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1b570 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1b580 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1b590 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1b5a0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1b5b0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1b5c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b5d0 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
1b5e0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1b5f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1b600 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1b610 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b620 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
1b630 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72  pt already in pr
1b640 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09  ogress.");......
1b650 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
1b660 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d  TION_ACTIVE);..}
1b670 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63  ...if (hKey >= c
1b680 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1b690 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1b6a0 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63  ies_count) {...c
1b6b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1b6c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1b6d0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1b6e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b6f0 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f  r.  Key handle o
1b700 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
1b710 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45  ...return(CKR_KE
1b720 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  Y_HANDLE_INVALID
1b730 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
1b740 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b750 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
1b760 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
1b770 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b780 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e  ].decrypt_mechan
1b790 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  ism = pMechanism
1b7a0 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63 61  ->mechanism;..ca
1b7b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1b7c0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1b7d0 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65 63  mech_parm = pMec
1b7e0 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65 74  hanism->pParamet
1b7f0 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  er;..cackey_sess
1b800 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
1b810 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
1b820 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  len = pMechanism
1b830 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65 6e  ->ulParameterLen
1b840 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
1b850 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1b860 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1b870 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1b880 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1b890 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b8a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b8b0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1b8c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b8d0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1b8e0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1b8f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1b900 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1b910 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1b920 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1b930 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1b940 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1b950 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Decrypt)(CK_SESS
1b960 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1b970 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1b980 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
1b990 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
1b9a0 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b  yptedDataLen, CK
1b9b0 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
1b9c0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1b9d0 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f  lDataLen) {..CK_
1b9e0 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70  ULONG datalen_up
1b9f0 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69  date, datalen_fi
1ba00 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72  nal;..CK_RV decr
1ba10 79 70 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ypt_ret;...CACKE
1ba20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ba30 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1ba40 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1ba50 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1ba60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ba70 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1ba80 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1ba90 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1baa0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1bab0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
1bac0 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  DataLen == NULL)
1bad0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1bae0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1baf0 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e   pulDataLen is N
1bb00 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1bb10 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1bb20 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c  BAD);..}...datal
1bb30 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c  en_update = *pul
1bb40 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79  DataLen;...decry
1bb50 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79  pt_ret = C_Decry
1bb60 70 74 55 70 64 61 74 65 28 68 53 65 73 73 69 6f  ptUpdate(hSessio
1bb70 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  n, pEncryptedDat
1bb80 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61  a, ulEncryptedDa
1bb90 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64  taLen, pData, &d
1bba0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a  atalen_update);.
1bbb0 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  .if (decrypt_ret
1bbc0 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
1bbd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bbe0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
1bbf0 72 79 70 74 55 70 64 61 74 65 28 29 20 72 65 74  ryptUpdate() ret
1bc00 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
1bc10 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
1bc20 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72  igned long) decr
1bc30 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ypt_ret);....ret
1bc40 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29  urn(decrypt_ret)
1bc50 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61  ;..}...if (pData
1bc60 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64  ) {...pData += d
1bc70 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09  atalen_update;..
1bc80 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  }..datalen_final
1bc90 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d   = *pulDataLen -
1bca0 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b   datalen_update;
1bcb0 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d  ...decrypt_ret =
1bcc0 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28   C_DecryptFinal(
1bcd0 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c  hSession, pData,
1bce0 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29   &datalen_final)
1bcf0 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ;..if (decrypt_r
1bd00 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
1bd10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bd20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
1bd30 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65  ecryptFinal() re
1bd40 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
1bd50 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
1bd60 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63  signed long) dec
1bd70 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65  rypt_ret);....re
1bd80 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74  turn(decrypt_ret
1bd90 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61  );..}...*pulData
1bda0 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70  Len = datalen_up
1bdb0 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66  date + datalen_f
1bdc0 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  inal;...CACKEY_D
1bdd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1bde0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1bdf0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1be00 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1be10 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1be20 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
1be30 65 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ecryptUpdate)(CK
1be40 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1be50 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1be60 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
1be70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
1be80 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
1be90 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1bea0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
1beb0 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
1bec0 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45  ..static CK_BYTE
1bed0 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73   buf[16384];..ss
1bee0 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43  ize_t buflen;..C
1bef0 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
1bf00 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
1bf10 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1bf20 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1bf30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1bf40 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1bf50 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1bf60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1bf70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1bf80 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1bf90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1bfa0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1bfb0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1bfc0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
1bfd0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
1bfe0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
1bff0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1c000 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1c010 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
1c020 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c030 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1c040 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
1c050 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
1c060 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1c070 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1c080 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70  .}...if (pEncryp
1c090 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20  tedPart == NULL 
1c0a0 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  && ulEncryptedPa
1c0b0 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
1c0c0 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
1c0d0 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 64   if we are asked
1c0e0 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f 74 68   to decrypt noth
1c0f0 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
1c100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c110 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1c120 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
1c130 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
1c140 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c150 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45  OK);..}...if (pE
1c160 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20  ncryptedPart == 
1c170 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1c180 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c190 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 65 64  rror. pEncrypted
1c1a0 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75  Part is NULL, bu
1c1b0 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  t ulEncryptedPar
1c1c0 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29  tLen is not 0.")
1c1d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c1e0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1c1f0 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72 79  .}...if (ulEncry
1c200 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30  ptedPartLen == 0
1c210 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c220 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c230 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  . ulEncryptedPar
1c240 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70  tLen is 0, but p
1c250 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Part is not NULL
1c260 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c270 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1c280 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 50  );..}...if (pulP
1c290 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20  artLen == NULL) 
1c2a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c2b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c2c0 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e 55  pulPartLen is NU
1c2d0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1c2e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1c2f0 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
1c300 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1c310 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1c320 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1c330 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1c340 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1c350 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c360 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1c370 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1c380 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1c390 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1c3a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c3b0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1c3c0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1c3d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1c3e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1c3f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c400 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1c410 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1c420 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1c430 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1c440 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1c450 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1c460 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
1c470 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
1c480 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1c490 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1c4a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1c4b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c4c0 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
1c4d0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1c4e0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1c4f0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
1c500 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1c510 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
1c520 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c530 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e  ].decrypt_mechan
1c540 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ism) {...case CK
1c550 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f  M_RSA_PKCS:..../
1c560 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65  * Ask card to de
1c570 63 72 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c  crypt */....bufl
1c580 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e  en = cackey_sign
1c590 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f  decrypt(&cackey_
1c5a0 73 6c 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73  slots[cackey_ses
1c5b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1c5c0 73 6c 6f 74 49 44 5d 2c 20 70 45 6e 63 72 79 70  slotID], pEncryp
1c5d0 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79  tedPart, ulEncry
1c5e0 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66  ptedPartLen, buf
1c5f0 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a  , sizeof(buf));.
1c600 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c  ....if (buflen <
1c610 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63   0) {...../* Dec
1c620 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20  ryption failed. 
1c630 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  */.....retval = 
1c640 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1c650 52 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20  R;....} else if 
1c660 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
1c670 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c  ) buflen) > *pul
1c680 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74  PartLen && pPart
1c690 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
1c6a0 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61  pted data too la
1c6b0 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  rge */.....retva
1c6c0 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
1c6d0 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65  OO_SMALL;....} e
1c6e0 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50  lse {.....if (pP
1c6f0 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63  art) {......memc
1c700 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62  py(pPart, buf, b
1c710 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09  uflen);.....}...
1c720 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d  ...*pulPartLen =
1c730 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65   buflen;......re
1c740 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09  tval = CKR_OK;..
1c750 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
1c760 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1c770 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1c780 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1c790 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1c7a0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1c7b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c7c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c7d0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1c7e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1c7f0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1c800 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1c810 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1c820 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
1c830 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  t) retval);...re
1c840 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
1c850 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1c860 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
1c870 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ryptFinal)(CK_SE
1c880 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1c890 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1c8a0 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b  TR pLastPart, CK
1c8b0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61  _ULONG_PTR pulLa
1c8c0 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e  stPartLen) {..in
1c8d0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1c8e0 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64  .int terminate_d
1c8f0 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41  ecrypt = 1;...CA
1c900 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c910 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1c920 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1c930 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1c940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c950 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1c960 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1c970 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1c980 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1c990 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1c9a0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1c9b0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1c9c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1c9d0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1c9e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1c9f0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1ca00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ca10 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1ca20 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1ca30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1ca40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1ca50 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1ca60 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  (pulLastPartLen 
1ca70 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1ca80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ca90 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74  ("Error. pulLast
1caa0 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  PartLen is NULL.
1cab0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1cac0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1cad0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1cae0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1caf0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1cb00 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1cb10 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1cb20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1cb30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1cb40 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1cb50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1cb60 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1cb70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1cb80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1cb90 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
1cba0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1cbb0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1cbc0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1cbd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cbe0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1cbf0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1cc00 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1cc10 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1cc20 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1cc30 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1cc40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
1cc50 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
1cc60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1cc70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1cc80 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1cc90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cca0 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74  or.  Decrypt not
1ccb0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1ccc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
1ccd0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
1cce0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75  LIZED);..}...*pu
1ccf0 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30  lLastPartLen = 0
1cd00 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72  ;...if (pLastPar
1cd10 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74  t == NULL) {...t
1cd20 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
1cd30 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74   = 0;..}...if (t
1cd40 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
1cd50 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
1cd60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1cd70 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
1cd80 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
1cd90 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1cda0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1cdb0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1cdc0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1cdd0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1cde0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1cdf0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1ce00 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1ce10 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1ce20 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
1ce30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ce40 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1ce50 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1ce60 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1ce70 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1ce80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1ce90 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29  V, C_DigestInit)
1cea0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1ceb0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1cec0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
1ced0 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43  echanism) {..CAC
1cee0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cef0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1cf00 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1cf10 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1cf20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cf30 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1cf40 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1cf50 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1cf60 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1cf70 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1cf80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cf90 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1cfa0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1cfb0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1cfc0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1cfd0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1cfe0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1cff0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1d000 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1d010 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
1d020 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gest)(CK_SESSION
1d030 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1d040 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
1d050 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
1d060 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
1d070 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
1d080 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
1d090 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
1d0a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d0b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1d0c0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1d0d0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1d0e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d0f0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1d100 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1d110 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1d120 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1d130 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1d140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1d150 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1d160 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1d170 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1d180 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1d190 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1d1a0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1d1b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1d1c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1d1d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
1d1e0 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
1d1f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1d200 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1d210 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
1d220 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
1d230 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d240 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1d250 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1d260 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1d270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d280 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1d290 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1d2a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1d2b0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1d2c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1d2d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d2e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1d2f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1d300 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1d310 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1d320 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1d330 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1d340 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1d350 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d360 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d370 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f  C_DigestKey)(CK_
1d380 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1d390 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
1d3a0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
1d3b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1d3c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1d3d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1d3e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1d3f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d400 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1d410 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1d420 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d430 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1d440 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1d450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d460 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1d470 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1d480 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1d490 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1d4a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1d4b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1d4c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1d4d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1d4e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1d4f0 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29  , C_DigestFinal)
1d500 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1d510 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1d520 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
1d530 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1d540 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
1d550 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d560 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1d570 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1d580 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1d590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d5a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1d5b0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1d5c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1d5d0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1d5e0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1d5f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d600 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1d610 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1d620 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1d630 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1d640 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1d650 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1d660 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1d670 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1d680 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1d690 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45  _SignInit)(CK_SE
1d6a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1d6b0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
1d6c0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
1d6d0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
1d6e0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e  NDLE hKey) {..in
1d6f0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1d700 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b  ..hKey--;...CACK
1d710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d720 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1d730 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1d740 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1d750 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d760 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1d770 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1d780 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1d790 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1d7a0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  ED);..}...if (pM
1d7b0 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c  echanism == NULL
1d7c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d7d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d7e0 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20  . pMechanism is 
1d7f0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1d800 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1d810 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1d820 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
1d830 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41  anism != CKM_RSA
1d840 5f 50 4b 43 53 20 26 26 20 70 4d 65 63 68 61 6e  _PKCS && pMechan
1d850 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21  ism->mechanism !
1d860 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50  = CKM_SHA1_RSA_P
1d870 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KCS) {...CACKEY_
1d880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d890 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d  ror. pMechanism-
1d8a0 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73  >mechanism not s
1d8b0 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f  pecified as CKM_
1d8c0 52 53 41 5f 50 4b 43 53 20 6f 72 20 43 4b 4d 5f  RSA_PKCS or CKM_
1d8d0 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 22 29 3b  SHA1_RSA_PKCS");
1d8e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d  ....return(CKR_M
1d8f0 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49  ECHANISM_PARAM_I
1d900 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
1d910 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
1d920 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
1d930 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1d940 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1d950 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1d960 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1d970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d980 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1d990 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
1d9a0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1d9b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1d9c0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1d9d0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1d9e0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1d9f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1da00 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1da10 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1da20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1da30 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1da40 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1da50 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1da60 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1da70 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1da80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1da90 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1daa0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1dab0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1dac0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1dad0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1dae0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1daf0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1db00 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1db10 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1db20 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1db30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1db40 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
1db50 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1db60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1db70 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1db80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1db90 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c  "Error.  Sign al
1dba0 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73  ready in progres
1dbb0 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  s.");......retur
1dbc0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
1dbd0 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
1dbe0 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79   (hKey >= cackey
1dbf0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1dc00 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
1dc10 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  ount) {...cackey
1dc20 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1dc30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1dc40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dc50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b  RINTF("Error.  K
1dc60 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ey handle out of
1dc70 20 72 61 6e 67 65 2e 22 29 3b 0a 0a 09 09 72 65   range.");....re
1dc80 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
1dc90 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1dca0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1dcb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1dcc0 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09  n_active = 1;...
1dcd0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1dce0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
1dcf0 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68  echanism = pMech
1dd00 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
1dd10 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
1dd20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1dd30 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b  gn_buflen = 128;
1dd40 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1dd50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
1dd60 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63  _bufused = 0;..c
1dd70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1dd80 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
1dd90 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  f = malloc(sizeo
1dda0 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f(*cackey_sessio
1ddb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1ddc0 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f  n_buf) * cackey_
1ddd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1dde0 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b  n].sign_buflen);
1ddf0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1de00 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1de10 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1de20 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1de30 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1de40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1de50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1de60 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1de70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1de80 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1de90 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1dea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1deb0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1dec0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1ded0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1dee0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1def0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
1df00 69 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ign)(CK_SESSION_
1df10 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1df20 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
1df30 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
1df40 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
1df50 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
1df60 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1df70 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
1df80 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b  .CK_RV sign_ret;
1df90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1dfa0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1dfb0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1dfc0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1dfd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dfe0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1dff0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1e000 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e010 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1e020 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1e030 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69  .sign_ret = C_Si
1e040 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f  gnUpdate(hSessio
1e050 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61  n, pData, ulData
1e060 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f  Len);..if (sign_
1e070 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
1e080 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e090 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1e0a0 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74  SignUpdate() ret
1e0b0 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
1e0c0 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
1e0d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e  igned long) sign
1e0e0 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
1e0f0 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a  (sign_ret);..}..
1e100 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69  .sign_ret = C_Si
1e110 67 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e  gnFinal(hSession
1e120 2c 20 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75  , pSignature, pu
1e130 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a  lSignatureLen);.
1e140 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d  .if (sign_ret !=
1e150 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
1e160 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e170 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69  ("Error.  SignFi
1e180 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66  nal() returned f
1e190 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
1e1a0 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
1e1b0 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
1e1c0 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
1e1d0 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  et);..}...CACKEY
1e1e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1e1f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1e200 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1e210 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1e220 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1e230 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1e240 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f  _SignUpdate)(CK_
1e250 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1e260 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1e270 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
1e280 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
1e290 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
1e2a0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1e2b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e2c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1e2d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e2e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e2f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e300 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e310 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e320 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e330 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e340 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1e350 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1e360 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1e370 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1e380 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1e390 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1e3a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e3b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1e3c0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1e3d0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1e3e0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1e3f0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1e400 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20  ..}...if (pPart 
1e410 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72  == NULL && ulPar
1e420 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  tLen == 0) {.../
1e430 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 20  * Short circuit 
1e440 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 64 20  if we are asked 
1e450 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e  to sign nothing.
1e460 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  .. */...CACKEY_D
1e470 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1e480 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1e490 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
1e4a0 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
1e4b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1e4c0 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20  ..}...if (pPart 
1e4d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1e4e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e4f0 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74 20 69  ("Error. pPart i
1e500 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61  s NULL, but ulPa
1e510 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22  rtLen is not 0."
1e520 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e530 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1e540 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72 74  ..}...if (ulPart
1e550 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  Len == 0) {...CA
1e560 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e570 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 72 74  F("Error. ulPart
1e580 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50  Len is 0, but pP
1e590 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  art is not NULL.
1e5a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e5b0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1e5c0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1e5d0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1e5e0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1e5f0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1e600 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1e610 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e620 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e630 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1e640 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1e650 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1e660 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1e670 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1e680 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
1e690 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1e6a0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1e6b0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1e6c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e6d0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1e6e0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1e6f0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1e700 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1e710 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1e720 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1e730 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
1e740 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
1e750 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1e760 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1e770 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1e780 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e790 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76    Sign not activ
1e7a0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1e7b0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
1e7c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1e7d0 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
1e7e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1e7f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
1e800 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
1e810 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
1e820 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65  .../* Accumulate
1e830 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09   directly */....
1e840 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65 73 73  if ((cackey_sess
1e850 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1e860 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20 75 6c  ign_bufused + ul
1e870 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65  PartLen) > cacke
1e880 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e890 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
1e8a0 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  ) {.....cackey_s
1e8b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1e8c0 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d  ].sign_buflen *=
1e8d0 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f   2;......cackey_
1e8e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1e8f0 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65  n].sign_buf = re
1e900 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73  alloc(cackey_ses
1e910 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1e920 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66  sign_buf, sizeof
1e930 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (*cackey_session
1e940 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
1e950 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73  _buf) * cackey_s
1e960 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1e970 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a  ].sign_buflen);.
1e980 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28  ...}.....memcpy(
1e990 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1e9a0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
1e9b0 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73  uf + cackey_sess
1e9c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1e9d0 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61  ign_bufused, pPa
1e9e0 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a  rt, ulPartLen);.
1e9f0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1ea00 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1ea10 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c  gn_bufused += ul
1ea20 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65  PartLen;.....bre
1ea30 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53  ak;...case CKM_S
1ea40 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  HA1_RSA_PKCS:...
1ea50 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 69  ./* Accumulate i
1ea60 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73 68 20  nto a SHA1 hash 
1ea70 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  */....cackey_mut
1ea80 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ea90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
1eaa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eab0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1eac0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1ead0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1eae0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1eaf0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09  _SUPPORTED);....
1eb00 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1eb10 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1eb20 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ED);....break;..
1eb30 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1eb40 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1eb50 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1eb60 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1eb70 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1eb80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1eb90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1eba0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1ebb0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1ebc0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1ebd0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1ebe0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1ebf0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1ec00 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1ec10 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1ec20 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1ec30 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1ec40 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45  SignFinal)(CK_SE
1ec50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1ec60 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1ec70 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
1ec80 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
1ec90 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
1eca0 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73  static CK_BYTE s
1ecb0 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73  igbuf[1024];..ss
1ecc0 69 7a 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b  ize_t sigbuflen;
1ecd0 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
1ece0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
1ecf0 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61  OR;..int termina
1ed00 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e  te_sign = 1;..in
1ed10 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1ed20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ed30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ed40 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1ed50 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1ed60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ed70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1ed80 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1ed90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1eda0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1edb0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1edc0 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65  if (pulSignature
1edd0 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
1ede0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1edf0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
1ee00 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20  SignatureLen is 
1ee10 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1ee20 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1ee30 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1ee40 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1ee50 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1ee60 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1ee70 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1ee80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1ee90 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1eea0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1eeb0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1eec0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1eed0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1eee0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1eef0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1ef00 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1ef10 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1ef20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1ef30 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1ef40 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1ef50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ef60 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1ef70 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1ef80 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1ef90 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1efa0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1efb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1efc0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1efd0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1efe0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1eff0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f000 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1f010 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
1f020 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1f030 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1f040 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1f050 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1f060 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1f070 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
1f080 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1f090 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1f0a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1f0b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f0c0 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
1f0d0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1f0e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
1f0f0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
1f100 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69  LIZED);..}...swi
1f110 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
1f120 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1f130 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ign_mechanism) {
1f140 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
1f150 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20  PKCS:..../* Ask 
1f160 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a  card to sign */.
1f170 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63  ...sigbuflen = c
1f180 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
1f190 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1f1a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f1b0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
1f1c0 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ], cackey_sessio
1f1d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1f1e0 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65  n_buf, cackey_se
1f1f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f200 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 2c 20 73 69  .sign_buflen, si
1f210 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67  gbuf, sizeof(sig
1f220 62 75 66 29 29 3b 0a 0a 09 09 09 69 66 20 28 73  buf));.....if (s
1f230 69 67 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a  igbuflen < 0) {.
1f240 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66  ..../* Signing f
1f250 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65  ailed. */.....re
1f260 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
1f270 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65  AL_ERROR;....} e
1f280 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e  lse if (((unsign
1f290 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c  ed long) sigbufl
1f2a0 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74  en) > *pulSignat
1f2b0 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61  ureLen && pSigna
1f2c0 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53  ture) {...../* S
1f2d0 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c  igned data too l
1f2e0 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76  arge */.....retv
1f2f0 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
1f300 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09  TOO_SMALL;......
1f310 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
1f320 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a   0;....} else {.
1f330 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
1f340 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20  gn = 0;......if 
1f350 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09  (pSignature) {..
1f360 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e  ....memcpy(pSign
1f370 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73  ature, sigbuf, s
1f380 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  igbuflen);......
1f390 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
1f3a0 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  = 1;.....}......
1f3b0 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
1f3c0 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09   = sigbuflen;...
1f3d0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
1f3e0 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65  OK;....}.....bre
1f3f0 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53  ak;...case CKM_S
1f400 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  HA1_RSA_PKCS:...
1f410 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 69  ./* Accumulate i
1f420 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73 68 20  nto a SHA1 hash 
1f430 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  */....cackey_mut
1f440 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1f450 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
1f460 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f470 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1f480 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1f490 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1f4a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1f4b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09  _SUPPORTED);....
1f4c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1f4d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1f4e0 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ED);....break;..
1f4f0 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74  }...if (terminat
1f500 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28  e_sign) {...if (
1f510 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f520 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
1f530 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  uf) {....free(ca
1f540 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1f550 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
1f560 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
1f570 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1f580 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  on].sign_active 
1f590 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  = 0;..}...mutex_
1f5a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1f5b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1f5c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1f5d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1f5e0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1f5f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f600 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1f610 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1f620 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1f630 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
1f640 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f650 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69  TF("Returning %i
1f660 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
1f670 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
1f680 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
1f690 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1f6a0 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e   C_SignRecoverIn
1f6b0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
1f6c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1f6d0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
1f6e0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
1f6f0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
1f700 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
1f710 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1f720 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1f730 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1f740 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f750 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f760 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1f770 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1f780 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1f790 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1f7a0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1f7b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f7c0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1f7d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1f7e0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1f7f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f800 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f810 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1f820 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1f830 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1f840 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f  K_RV, C_SignReco
1f850 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ver)(CK_SESSION_
1f860 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1f870 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
1f880 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
1f890 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
1f8a0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
1f8b0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1f8c0 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
1f8d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f8e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1f8f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1f900 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1f910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f920 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1f930 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1f940 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1f950 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1f960 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1f970 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f980 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1f990 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1f9a0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1f9b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1f9c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1f9d0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1f9e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f9f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1fa00 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1fa10 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b  C_VerifyInit)(CK
1fa20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1fa30 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
1fa40 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
1fa50 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
1fa60 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
1fa70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fa80 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1fa90 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1faa0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1fab0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fac0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1fad0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1fae0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1faf0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1fb00 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1fb10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fb20 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1fb30 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1fb40 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1fb50 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1fb60 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1fb70 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1fb80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1fb90 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1fba0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1fbb0 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53  C_Verify)(CK_SES
1fbc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1fbd0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1fbe0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
1fbf0 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
1fc00 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
1fc10 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
1fc20 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
1fc30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fc40 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1fc50 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1fc60 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1fc70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fc80 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1fc90 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1fca0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1fcb0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1fcc0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1fcd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fce0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1fcf0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1fd00 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1fd10 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1fd20 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1fd30 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1fd40 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1fd50 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1fd60 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1fd70 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 29 28  C_VerifyUpdate)(
1fd80 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1fd90 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1fda0 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
1fdb0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
1fdc0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
1fdd0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1fde0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1fdf0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1fe00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fe10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fe20 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1fe30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1fe40 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1fe50 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1fe60 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1fe70 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1fe80 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1fe90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1fea0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1feb0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1fec0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1fed0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1fee0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1fef0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1ff00 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e  _RV, C_VerifyFin
1ff10 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
1ff20 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1ff30 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
1ff40 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
1ff50 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29   ulSignatureLen)
1ff60 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1ff70 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1ff80 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1ff90 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1ffa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ffb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ffc0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ffd0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ffe0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1fff0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20000 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20010 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20020 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
20030 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
20040 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
20050 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20060 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
20070 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
20080 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
20090 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
200a0 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76  V, C_VerifyRecov
200b0 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  erInit)(CK_SESSI
200c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
200d0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
200e0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
200f0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
20100 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
20110 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20120 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
20130 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20140 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20160 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20170 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20180 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20190 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
201a0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
201b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
201c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
201d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
201e0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
201f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20200 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
20210 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20220 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
20230 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20240 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
20250 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45  fyRecover)(CK_SE
20260 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
20270 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
20280 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
20290 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74  K_ULONG ulSignat
202a0 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ureLen, CK_BYTE_
202b0 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
202c0 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c  ONG_PTR pulDataL
202d0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
202e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
202f0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
20300 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
20310 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20320 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20330 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
20340 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
20350 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
20360 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
20370 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
20380 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20390 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
203a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
203b0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
203c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
203d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
203e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
203f0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
20400 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
20410 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e  K_RV, C_DigestEn
20420 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
20430 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
20440 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
20450 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
20460 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
20470 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
20480 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
20490 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
204a0 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
204b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
204c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
204d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
204e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
204f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20500 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20510 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20520 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20530 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20540 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
20550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20560 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20570 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20580 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
20590 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
205a0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
205b0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
205c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
205d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
205e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
205f0 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55  C_DecryptDigestU
20600 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
20610 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
20620 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
20630 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
20640 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
20650 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42  tedPartLen, CK_B
20660 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
20670 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50  K_ULONG_PTR pulP
20680 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
20690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
206a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
206b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
206c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
206d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
206e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
206f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20700 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20710 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20720 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
20730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20740 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
20750 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20760 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
20770 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20780 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
20790 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
207a0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
207b0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
207c0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
207d0 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43  EncryptUpdate)(C
207e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
207f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
20800 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
20810 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
20820 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
20830 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
20840 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
20850 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
20860 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
20870 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
20880 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
20890 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
208a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
208b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
208c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
208d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
208e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
208f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
20900 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20910 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20920 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20930 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
20940 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
20950 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
20960 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
20970 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20980 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
20990 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
209a0 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66  , C_DecryptVerif
209b0 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  yUpdate)(CK_SESS
209c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
209d0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
209e0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
209f0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
20a00 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b  yptedPartLen, CK
20a10 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
20a20 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
20a30 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
20a40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20a50 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
20a60 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
20a70 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
20a80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20a90 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
20aa0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
20ab0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
20ac0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
20ad0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
20ae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20af0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
20b00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20b10 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
20b20 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
20b30 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
20b40 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
20b50 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
20b60 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
20b70 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
20b80 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45  nerateKey)(CK_SE
20b90 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
20ba0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
20bb0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
20bc0 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  sm, CK_ATTRIBUTE
20bd0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
20be0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
20bf0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
20c00 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a  LE_PTR phKey) {.
20c10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20c20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20c30 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20c40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20c50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20c60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20c70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20c80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20c90 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20ca0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
20cb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20cc0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20cd0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20ce0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
20cf0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20d00 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
20d10 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
20d20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20d30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
20d40 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
20d50 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
20d60 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
20d70 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
20d80 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
20d90 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41  pMechanism, CK_A
20da0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 75  TTRIBUTE_PTR pPu
20db0 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c  blicKeyTemplate,
20dc0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c   CK_ULONG ulPubl
20dd0 69 63 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f  icKeyAttributeCo
20de0 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  unt, CK_ATTRIBUT
20df0 45 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b 65  E_PTR pPrivateKe
20e00 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  yTemplate, CK_UL
20e10 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79  ONG ulPrivateKey
20e20 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
20e30 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
20e40 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79  _PTR phPublicKey
20e50 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
20e60 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61 74 65  LE_PTR phPrivate
20e70 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
20e80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
20e90 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20ea0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20eb0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20ec0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20ed0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20ee0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20ef0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20f00 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20f10 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
20f20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20f30 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
20f40 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
20f50 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
20f60 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20f70 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
20f80 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20f90 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
20fa0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20fb0 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79  CK_RV, C_WrapKey
20fc0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
20fd0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
20fe0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
20ff0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
21000 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61  JECT_HANDLE hWra
21010 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ppingKey, CK_OBJ
21020 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c  ECT_HANDLE hKey,
21030 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72   CK_BYTE_PTR pWr
21040 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f  appedKey, CK_ULO
21050 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65  NG_PTR pulWrappe
21060 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  dKeyLen) {..CACK
21070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21080 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
21090 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
210a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
210b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
210c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
210d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
210e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
210f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
21100 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
21110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
21120 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
21130 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21140 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
21150 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21160 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
21170 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
21180 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
21190 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
211a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77  ION(CK_RV, C_Unw
211b0 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  rapKey)(CK_SESSI
211c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
211d0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
211e0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
211f0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
21200 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79  E hUnwrappingKey
21210 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57  , CK_BYTE_PTR pW
21220 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c  rappedKey, CK_UL
21230 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79  ONG ulWrappedKey
21240 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  Len, CK_ATTRIBUT
21250 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
21260 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72   CK_ULONG ulAttr
21270 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f  ibuteCount, CK_O
21280 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
21290 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45   phKey) {..CACKE
212a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
212b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
212c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
212d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
212e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
212f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21300 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21310 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21320 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
21330 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
21340 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
21350 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
21360 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21370 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
21380 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21390 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
213a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
213b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
213c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
213d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69  ON(CK_RV, C_Deri
213e0 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  veKey)(CK_SESSIO
213f0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
21400 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
21410 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
21420 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
21430 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54   hBaseKey, CK_AT
21440 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
21450 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
21460 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  ulAttributeCount
21470 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
21480 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a  LE_PTR phKey) {.
21490 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
214a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
214b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
214c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
214d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
214e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
214f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
21500 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21510 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
21520 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
21530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21540 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
21550 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
21560 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
21570 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21580 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
21590 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
215a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
215b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
215c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
215d0 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b  C_SeedRandom)(CK
215e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
215f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
21600 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f  E_PTR pSeed, CK_
21610 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29  ULONG ulSeedLen)
21620 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
21630 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
21640 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
21650 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
21660 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21670 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21680 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
21690 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
216a0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
216b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
216c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
216d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
216e0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
216f0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
21700 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
21710 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21720 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
21730 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21740 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
21750 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
21760 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e  V, C_GenerateRan
21770 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  dom)(CK_SESSION_
21780 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
21790 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61   CK_BYTE_PTR pRa
217a0 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  ndomData, CK_ULO
217b0 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20  NG ulRandomLen) 
217c0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
217d0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
217e0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
217f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
21800 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21810 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21820 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21830 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21840 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21850 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21870 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21880 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21890 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
218a0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
218b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
218c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
218d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
218e0 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65  ED);.}../* Depre
218f0 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a  cated Function *
21900 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
21910 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
21920 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29  tFunctionStatus)
21930 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
21940 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
21950 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21960 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21970 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21980 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
21990 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
219a0 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22  T_PARALLEL (%i)"
219b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
219c0 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
219d0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
219e0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
219f0 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20  );...hSession = 
21a00 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70  hSession; /* Sup
21a10 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69  ress unused vari
21a20 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  able warning */.
21a30 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64  }../* Deprecated
21a40 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f   Function */.CK_
21a50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
21a60 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46  CK_RV, C_CancelF
21a70 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53  unction)(CK_SESS
21a80 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
21a90 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ion) {..CACKEY_D
21aa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
21ab0 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
21ac0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
21ad0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
21ae0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
21af0 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  EL (%i)", CKR_FU
21b00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
21b10 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  LEL);...return(C
21b20 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21b30 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65  PARALLEL);...hSe
21b40 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e  ssion = hSession
21b50 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
21b60 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
21b70 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45  ning */.}..CK_DE
21b80 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
21b90 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69  _RV, C_GetFuncti
21ba0 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54  onList)(CK_FUNCT
21bb0 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52  ION_LIST_PTR_PTR
21bc0 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29   ppFunctionList)
21bd0 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f   {..CK_FUNCTION_
21be0 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63 74 69  LIST_PTR pFuncti
21bf0 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59  onList;...CACKEY
21c00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
21c10 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
21c20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  ppFunctionList =
21c30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
21c40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21c50 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 74 69  "Error. ppFuncti
21c60 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22  onList is NULL."
21c70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21c80 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
21c90 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ..}...pFunctionL
21ca0 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ist = malloc(siz
21cb0 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69  eof(*pFunctionLi
21cc0 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f  st));...pFunctio
21cd0 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d  nList->version.m
21ce0 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  ajor = ((CACKEY_
21cf0 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
21d00 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20  _CODE) >> 16) & 
21d10 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  0xff;..pFunction
21d20 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69  List->version.mi
21d30 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  nor = ((CACKEY_C
21d40 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
21d50 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78  CODE) >> 8) & 0x
21d60 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ff;...pFunctionL
21d70 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a  ist->C_Initializ
21d80 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65  e = C_Initialize
21d90 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
21da0 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43  ->C_Finalize = C
21db0 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e  _Finalize;..pFun
21dc0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
21dd0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f  Info = C_GetInfo
21de0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
21df0 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20  ->C_GetSlotList 
21e00 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b  = C_GetSlotList;
21e10 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
21e20 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d  >C_GetSlotInfo =
21e30 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a   C_GetSlotInfo;.
21e40 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
21e50 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d  C_GetTokenInfo =
21e60 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b   C_GetTokenInfo;
21e70 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
21e80 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76  >C_WaitForSlotEv
21e90 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53  ent = C_WaitForS
21ea0 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63  lotEvent;..pFunc
21eb0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d  tionList->C_GetM
21ec0 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43  echanismList = C
21ed0 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73  _GetMechanismLis
21ee0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
21ef0 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  t->C_GetMechanis
21f00 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63  mInfo = C_GetMec
21f10 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75  hanismInfo;..pFu
21f20 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e  nctionList->C_In
21f30 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74  itToken = C_Init
21f40 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  Token;..pFunctio
21f50 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e  nList->C_InitPIN
21f60 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70   = C_InitPIN;..p
21f70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
21f80 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49  SetPIN = C_SetPI
21f90 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  N;..pFunctionLis
21fa0 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e  t->C_OpenSession
21fb0 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e   = C_OpenSession
21fc0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
21fd0 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ->C_CloseSession
21fe0 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f   = C_CloseSessio
21ff0 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
22000 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73  t->C_CloseAllSes
22010 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41  sions = C_CloseA
22020 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75  llSessions;..pFu
22030 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
22040 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43  tSessionInfo = C
22050 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b  _GetSessionInfo;
22060 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
22070 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53  >C_GetOperationS
22080 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72  tate = C_GetOper
22090 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75  ationState;..pFu
220a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
220b0 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20  tOperationState 
220c0 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  = C_SetOperation
220d0 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  State;..pFunctio
220e0 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d  nList->C_Login =
220f0 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63   C_Login;..pFunc
22100 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f  tionList->C_Logo
22110 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09  ut = C_Logout;..
22120 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
22130 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20  _CreateObject = 
22140 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a  C_CreateObject;.
22150 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
22160 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43  C_CopyObject = C
22170 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46  _CopyObject;..pF
22180 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
22190 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43  estroyObject = C
221a0 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a  _DestroyObject;.
221b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
221c0 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20  C_GetObjectSize 
221d0 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a  = C_GetObjectSiz
221e0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
221f0 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74  t->C_GetAttribut
22200 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74  eValue = C_GetAt
22210 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70  tributeValue;..p
22220 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22230 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  SetAttributeValu
22240 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75  e = C_SetAttribu
22250 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74  teValue;..pFunct
22260 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f  ionList->C_FindO
22270 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46  bjectsInit = C_F
22280 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a  indObjectsInit;.
22290 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
222a0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20  C_FindObjects = 
222b0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09  C_FindObjects;..
222c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
222d0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61  _FindObjectsFina
222e0 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  l = C_FindObject
222f0 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  sFinal;..pFuncti
22300 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
22310 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70  tInit = C_Encryp
22320 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
22330 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
22340 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70   = C_Encrypt;..p
22350 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22360 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  EncryptUpdate = 
22370 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b  C_EncryptUpdate;
22380 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
22390 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20  >C_EncryptFinal 
223a0 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c  = C_EncryptFinal
223b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
223c0 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20  ->C_DecryptInit 
223d0 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b  = C_DecryptInit;
223e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
223f0 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44  >C_Decrypt = C_D
22400 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69  ecrypt;..pFuncti
22410 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
22420 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72  tUpdate = C_Decr
22430 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
22440 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
22450 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65  ryptFinal = C_De
22460 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75  cryptFinal;..pFu
22470 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
22480 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67  gestInit = C_Dig
22490 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  estInit;..pFunct
224a0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
224b0 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70  t = C_Digest;..p
224c0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
224d0 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43  DigestUpdate = C
224e0 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09  _DigestUpdate;..
224f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
22500 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f 44  _DigestKey = C_D
22510 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63  igestKey;..pFunc
22520 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
22530 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65  stFinal = C_Dige
22540 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  stFinal;..pFunct
22550 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49  ionList->C_SignI
22560 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74  nit = C_SignInit
22570 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
22580 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67  ->C_Sign = C_Sig
22590 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
225a0 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65 20  t->C_SignUpdate 
225b0 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a  = C_SignUpdate;.
225c0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
225d0 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f  C_SignFinal = C_
225e0 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  SignFinal;..pFun
225f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
22600 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43  nRecoverInit = C
22610 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
22620 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
22630 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 20  ->C_SignRecover 
22640 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b  = C_SignRecover;
22650 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
22660 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d 20  >C_VerifyInit = 
22670 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09 70  C_VerifyInit;..p
22680 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22690 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69 66  Verify = C_Verif
226a0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
226b0 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61 74  t->C_VerifyUpdat
226c0 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64 61  e = C_VerifyUpda
226d0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
226e0 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e 61  st->C_VerifyFina
226f0 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e 61  l = C_VerifyFina
22700 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
22710 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76  t->C_VerifyRecov
22720 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66  erInit = C_Verif
22730 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70  yRecoverInit;..p
22740 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22750 56 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d 20  VerifyRecover = 
22760 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 3b  C_VerifyRecover;
22770 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
22780 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74  >C_DigestEncrypt
22790 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73  Update = C_Diges
227a0 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  tEncryptUpdate;.
227b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
227c0 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55  C_DecryptDigestU
227d0 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
227e0 74 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09  tDigestUpdate;..
227f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
22800 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61  _SignEncryptUpda
22810 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79  te = C_SignEncry
22820 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
22830 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
22840 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 20  yptVerifyUpdate 
22850 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66  = C_DecryptVerif
22860 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  yUpdate;..pFunct
22870 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72  ionList->C_Gener
22880 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72  ateKey = C_Gener
22890 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  ateKey;..pFuncti
228a0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61  onList->C_Genera
228b0 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47 65  teKeyPair = C_Ge
228c0 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a 09  nerateKeyPair;..
228d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
228e0 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72 61  _WrapKey = C_Wra
228f0 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  pKey;..pFunction
22900 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65  List->C_UnwrapKe
22910 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b  y = C_UnwrapKey;
22920 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
22930 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20 43  >C_DeriveKey = C
22940 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46 75  _DeriveKey;..pFu
22950 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
22960 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65  edRandom = C_See
22970 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74  dRandom;..pFunct
22980 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72  ionList->C_Gener
22990 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65  ateRandom = C_Ge
229a0 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70  nerateRandom;..p
229b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
229c0 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75  GetFunctionStatu
229d0 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  s = C_GetFunctio
229e0 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63 74  nStatus;..pFunct
229f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65  ionList->C_Cance
22a00 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61  lFunction = C_Ca
22a10 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70  ncelFunction;..p
22a20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22a30 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  GetFunctionList 
22a40 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  = C_GetFunctionL
22a50 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69  ist;...*ppFuncti
22a60 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74 69  onList = pFuncti
22a70 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59  onList;...CACKEY
22a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22a90 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
22aa0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
22ab0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
22ac0 3b 0a 7d 0a 0a                                   ;.}..